【问题标题】:Function needs to return Rest Call response as JSON object. How to set the response to a variable so that it can be return as variable函数需要将 Rest Call 响应作为 JSON 对象返回。如何设置对变量的响应,以便它可以作为变量返回
【发布时间】:2016-05-08 22:42:26
【问题描述】:
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 调用响应并发送到其他函数。

【问题讨论】:

    标签: javascript node.js rest-client node-rest-client


    【解决方案1】:

    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;
      }
    }
    

    但是,也许,您应该返回 Promise,而不是数据。

    【讨论】:

    • 我不明白你为什么使用 sleep 而它是回调函数。
    • npmjs.com/package/deasync。它将暂停节点进程,因为 sleep 现在是同步的。但是,我永远不会推荐那种东西。
    • 为什么我们需要暂停代码?虽然我们可以通过将处理代码放在 get 函数中来做到这一点
    • 因为他不想返回,所以是同步调用,不是异步调用。
    • 我不太了解 Nodejs。实现这种场景的最佳实践应该是什么。我的基本要求是从这个 rest 调用中获取输出,并且需要在将其显示在屏幕上之前对其进行一些操作。
    【解决方案2】:

    因为 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);
        });
    
      }
    }
    

    【讨论】:

      【解决方案3】:

      我认为您在处理回调时遇到了困难,

      在方法getWeatherStatus中,处理完成后,您应该将其传递给回调函数,而不是返回结果。

      如果你真的需要返回,galk.in answer似乎是一种可能的方式。

      否则,请检查一下,

      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 也是一个不错的选择。但它仍然是异步的。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 2018-06-23
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 2017-12-04
        相关资源
        最近更新 更多