在我的 Node.js 代码中,我需要进行 2 或 3 个 API 调用,每个调用都会返回一些数据。所有 API 调用完成后,我想将所有数据收集到一个 JSON 对象中以发送到前端。
我知道如何使用 API 回调来执行此操作(下一个调用将在上一个调用的回调中发生),但这会很慢:
//1st request
request('http://www.example.com', function (err1, res1, body) {
//2nd request
request('http://www.example2.com', function (err2, res2, body2) {
//combine data and do something with it
});
});
我知道你也可以用承诺做一些类似和更简洁的事情,但我认为同样的概念适用于下一个调用在当前调用完成之前不会执行的情况。
有没有办法同时调用所有函数,但我的最后一个代码块要等待所有 API 调用完成并在执行之前提供数据?
承诺给你Promise.all()
(对于本机 Promise 以及像 Bluebird 这样的库 Promise 来说都是如此)。
Update:从 Node 8 开始,您可以使用util.promisify()
就像你对蓝鸟的那样.promisify()
var requestAsync = util.promisify(request); // const util = require('util')
var urls = ['url1', 'url2'];
Promise.all(urls.map(requestAsync)).then(allData => {
// All data available here in the order of the elements in the array
});
So what you can do (native):
function requestAsync(url) {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) { return reject(err); }
return resolve([res, body]);
});
});
}
Promise.all([requestAsync('url1'), requestAsync('url2')])
.then(function(allData) {
// All data available here in the order it was called.
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)