【问题标题】:Node.js request function return dataNode.js 请求函数返回数据
【发布时间】:2017-07-18 00:03:31
【问题描述】:

我已经解决了有关从节点 JS 请求调用返回数据的问题。一个常见的错误是假设语句是逐行或同步执行的,但这里不是这种情况。此类问题:How to get data out of a Node.js http get request

我的问题有点不同。我编写了一个函数 getNumber(),它返回给定查询的结果数。我想知道如何返回回调函数检索到的值?比如:

function getNumResults() { 

Request(url, function(response) { 

    var responseJSON = JSON.parse(body); 
    return(responseJSON.results.count); 

   }); 

}

function Request(URL, callback) {

request(URL,  function(error, response, body) { 

    console.log('URL: ', URL); 
    console.log('error: ', error); 
    console.log('statusCode: ', response && response.statusCode); 
    console.log('body: ', body); 
    callback(body); 
}); 

}

如果我希望 getNumResults() 返回 responseJSON.results.count 怎么办?我怎么能这样做?

【问题讨论】:

    标签: node.js request httprequest


    【解决方案1】:

    如果我希望 getNumResults() 返回 responseJSON.results.count 怎么办?我怎么能这样做?

    您不能直接从getNumResults() 返回异步值。你就是不能。该函数在值可用之前很久就返回了。这是时间问题。这就是异步响应的工作方式。它们在未来完成一些不确定的时间,但它们是非阻塞的,因此您的 Javascript 的其余部分会继续运行,因此该函数甚至在结果可用之前就返回了。

    获得结果的唯一方法是使用某种回调。这适用于您的 Request() 函数和我们的 getNumResults() 函数。一旦结果是异步的,调用链中的任何人都无法逃脱。异步具有传染性,您永远无法从异步回到同步。因此,如果您的getNumResults() 想要将值返回给它的调用者,它要么必须自己接受一个回调并在它获得值时调用该回调,要么它必须返回一个用该值解析的承诺。

    以下是使用 Promise 的方法(这是 Javascript 异步开发的未来):

    // load a version of the request library that returns promise instead of
    // taking plain callbacks
    const rp = require('request-promise');
    
    function getNumResults(url) {
        // returns a promise
        return rp(url).then(body => {
            // make the count be the resolved value of the promise
            let responseJSON = JSON.parse(body);
            return responseJSON.results.count;
        });
    }
    

    那么,你会像这样使用getNumResults()"

    getNumResults(someURL).then(count => {
        // use the count result in here
        console.log(`Got count = ${count}`);
    }).catch(err => {
        console.log('Got error from getNumResults ', err);
    });
    

    仅供参考,我认为您还可以通过设置适当的选项 {json: true} 来获取 request() 库来自动为您解析 JSON 响应。


    2020 年 1 月编辑 - request() 模块处于维护模式

    仅供参考,request 模块及其衍生模块(如request-promise)现在处于维护模式,不会积极开发以添加新功能。您可以阅读更多关于推理的信息herethis table 中有一个备选方案列表,其中对每个备选方案进行了一些讨论。我自己一直在使用got(),它从一开始就是使用 Promise 构建的,而且使用简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-29
      • 2014-03-27
      • 2020-06-26
      • 2021-06-28
      • 1970-01-01
      • 2015-01-13
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多