gpt4 book ai didi

javascript - 如何同时调用异步函数并等待所有回调?

转载 作者:行者123 更新时间:2023-11-30 08:27:22 25 4
gpt4 key购买 nike

在 nodeJS 中,如何同时调用异步函数并在继续之前等待所有回调?

在下面的示例中,我希望 main 仅在完成 ​​f1f2f3 时返回 all_results与回调()

function main(callback){
var all_results = [];
f1(function(results){
all_results.push(result)
});

f2(function(results){
all_results.push(result)
});

f3(function(results){
all_results.push(result)
});

// when all 3 calls are complete:
callback(all_results)
}


function f1(callback){
...
callback(results);
}

function f2(callback){
...
callback(results);
}

function f3(callback){
...
callback(results);
}

不使用 promise 。

最佳答案

您不能以同步方式返回异步检索的结果。所以函数 main 不能返回结果。您应该坚持使用您选择的异步方法。因此对于回调,您还应该在调用 main 时提供回调函数:

function main(callback){
var all_results = [];

function collect(results) {
all_results.push(results);
// when all 3 calls are complete:
if (all_results.length === 3) callback(all_results);
}

f1(collect);
f2(collect);
f3(collect);
}

这样调用:

main(function (all_results) {
console.log(all_results);
});

正如其他人所说,在这种情况下, promise 会带来更好的代码。

如何用 promise 做

假设您不能修改函数 f1f2f3,那么您可以创建 promisified 版本它们具有一个简单的辅助功能。完成后,ES6 包含的方法 Promise.all 将完成剩下的工作,因此代码变得非常简洁。

这是一个片段,它定义了一些虚拟函数 f1f2f3,它们使用 setTimeout 来获取异步效果:

function promisify(f) {
return new Promise(f);
}

function main(){
return Promise.all([f1, f2, f3].map(promisify));
}

main().then(function (results) {
console.log(results);
});

function f1(callback){
setTimeout(function () {
callback('result from f1');
}, 100);
}

function f2(callback){
setTimeout(function () {
callback('result from f2');
}, 500);
}

function f3(callback){
setTimeout(function () {
callback('result from f3');
}, 200);
}

关于javascript - 如何同时调用异步函数并等待所有回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43431447/

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