gpt4 book ai didi

javascript - 如何运行多个异步函数然后执行回调?

转载 作者:IT老高 更新时间:2023-10-28 22:00:59 30 4
gpt4 key购买 nike

在我的 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

});

});

我知道你也可以用 Promise 做一些类似的、更简洁的事情,但我认为同样的概念适用于下一个调用在当前调用完成之前不会执行的情况。

有没有办法同时调用所有函数,但我的最后一个代码块要等待所有 API 调用完成并在执行之前提供数据?

最佳答案

Promise 为您提供 Promise.all()(对于原生 Promise 以及 bluebird 等库的 Promise 都是如此)。

更新:从 Node 8 开始,您可以像使用 Bluebird 的 .promisify()

util.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
});

那么你可以做什么(原生):

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.
});

如果你有 bluebird ,那就更简单了:

var requestAsync = Promise.promisify(request);
var urls = ['url1', 'url2'];
Promise.all(urls.map(requestAsync)).then(allData => {
// All data available here in the order of the elements in the array
});

关于javascript - 如何运行多个异步函数然后执行回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com