2017-07-18 177 views
0

我已经经历了关于从节点JS请求调用返回数据的问题。一个常见的错误是假设语句是一行一行地执行还是同步执行,但这里并不是这种情况。这种类型的问题:How to get data out of a Node.js http get requestNode.js请求函数返回数据

我的问题有点不同。我写了一个函数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?我怎么能这样做?

回答

2

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

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

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

这里是你如何能做到这一点使用的承诺(这是异步的发展在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响应。

+0

这是如此清楚,谢谢sooo多! – Diana