Функция должна вернуть ответ 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);
});
}
}