Функция должна вернуть ответ Rest Call как объект JSON. Как установить ответ на переменную, чтобы его можно было вернуть как переменную

var Client = require('node-rest-client').Client;
var client = new Client();
module.exports = {
getWeatherStatus: function() {
        var messageData =  "";
        client.get("http://api.openweathermap.org/data/2.5/weather?q=Pune&appid=123234234234243242", function (data, response) {
            console.log(JSON.parse(data));
            messageData=data;
        });
        //how to set the response of that rest call to this messageData object
        return messageData;
    }
}

этот метод getWeatherStatus должен возвращать ответ остальных в формате json.

Открыто для совершенно другого предложения по реализации такого сценария. Моим основным требованием является использование этого ответа на вызов REST и отправка другим функциям.

3 ответа

Я думаю, что вы сталкиваетесь с трудностями при работе с обратными вызовами,

В методе getWeatherStatusвместо возврата результата вы должны передать его в функцию обратного вызова после завершения обработки.

Если на самом деле вы обязаны вернуться, ответ galk.in представляется возможным.

В противном случае, проверьте это,

var Client = require('node-rest-client').Client;
var client = new Client();
module.exports = {
  getWeatherStatus: function(then) {
    var messageData =  "";
    client.get("/some/url", function (data, response) {
        then(err=null, JSON.parse(data));
    });
  }
}

Таким образом, вы можете вызвать getWeatherStatus таким образом,

// Somewhere else in your code
getWeatherStatus(function fnCallback(err, jsonData) {
  console.log(jsonData) // process data here
})

Как и предполагалось, Promise также является хорошей альтернативой. но это все еще асинхронно.

В getWeatherStatus вы используете асинхронную функцию client.get, Вам нужно ждать результата от асинхронной функции и только потом возвращать messageData. Для этого вы можете использовать deasync. Пример:

var Client = require('node-rest-client').Client;
var client = new Client();
module.exports = {
  getWeatherStatus: function() {
    var messageData =  "";
    client.get("http://api.openweathermap.org/data/2.5/weather?q=Pune&appid=123234234234243242", function (data, response) {
      console.log(JSON.parse(data));
      messageData=data;
    });
    //We waiting for data.
    while (messageData === "") {
      require('deasync').sleep(10);
    }
    return messageData;
  }
}

Но, может быть, вы должны вернуть обещание, а не данные.

Так как get является функцией обратного вызова, поэтому вы должны поместить возвращаемое messageData вместо messageData=data.

Код должен быть как

 var Client = require('node-rest-client').Client;
var client = new Client();
module.exports = {
  getWeatherStatus: function() {
    var messageData =  "";
    client.get("http://api.openweathermap.org/data/2.5/weather?q=Pune&appid=123234234234243242", function (data, response) {
        return  JSON.parse(data);
    });

  }
}
Другие вопросы по тегам