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