我并不是在寻找任何特定语言的任何解决方案,我只是想了解从循环运行异步任务领域的良好实践。
这是我到目前为止的想法:
var callAcc = 0;
var resultArr = [];
for (var k = 0; k < 20; k++) {
callAcc ++;
asyncFunction("variable")
.then(function (result) {
resultArr.push(result);
if (callAcc === resultArr.length) {
// do something with the resultArr
}
})
.catch(function (err) {
console.warn(err);
});
}
此时,我只是使用一个同步变量,只有在完成所有异步任务后,它才会让我继续。然而,这感觉很奇怪,我想知道是否有某种设计模式可以从循环执行 aync 任务
编辑: 根据建议的解决方案,这就是我最终使用的
var promises = [];
for (var i = 0; i < 20; i ++) {
promises.push(asyncFunction("param"));
}
Promise.all(promises)
.then(function (result) {
console.log(result);
})
.catch(function (err) {
console.warn(err);
});
谢谢大家!
最佳答案
您可以使用 Promise.all
抽象出等待所有 Promise 的任务,而不是在循环中运行异步任务。函数,它将接受您的 Promise 的可迭代对象并创建一个新的 Promise,一旦所有 Promise 都解决,该 Promise 将返回一个数组,其中所有结果的顺序与原始 Promise 列表的顺序相同,或者如果其中任何一个失败,则失败。大多数具有 Promise 的语言都有类似的功能,如果没有,定义也不难。
如果您需要所有 promise 运行,即使其中任何一个失败,您也可以编写一个函数来执行此操作,您只需要定义如何处理失败的 promise (丢弃它们,返回错误不知何故......)。
无论如何,其要点是处理多个 Promise 编排的最佳方法是定义一个函数,该函数将获取您需要处理的所有 Promise 并返回一个将处理编排的新 Promise。
类似于:
orchestratePromises(promiseList) {
return new Promise((resolve, reject) => {
// set up
for (let promise of promiseList) {
// define how to handle your promises when they resolve
// asynchronously resolve or reject
}
}
}
关于javascript - 从循环运行异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282495/