Node.js请求函数返回数据

时间:2017-07-18 00:03:32

标签: node.js request httprequest

我已经解决了从节点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怎么办?我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

  

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

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

获得结果的唯一方法是使用某种回调。这适用于您的Request()功能和getNumResults()功能。一旦结果异步,调用链中的任何人都无法逃脱。异步是有感染力的,你永远不能从异步回到同步。因此,如果您的getNumResults()想要将值返回给它的调用者,它将要么自己接受回调并在获取值时调用该回调,否则它将返回一个使用值。

以下是使用promises(这是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);
});

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