javascript - 从循环运行异步函数

标签 javascript asynchronous design-patterns

我并不是在寻找任何特定语言的任何解决方案,我只是想了解从循环运行异步任务领域的良好实践。

这是我到目前为止的想法:

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/

相关文章:

java - 构造运行时要调用的方法名称

c# - 你会选择什么样的设计模式?

javascript - Google Apps 脚本日历服务 : How to store and retrieve CalendarEvents using PropertiesService?

javascript - 切换为 !运算符在页面加载 JavaScript 时不起作用

c# - HttpClient PostAsync() 从不返回响应

javascript - 在 Array.map 函数中使用 await

javascript - 添加或删除文本框,然后使用 PHP 或 Jquery 获取其值

javascript - 如何有效地编辑数据集深处的项目,显示为 react 组件?

angularjs - 无法多次调用 $http.get()

oop - "program to interfaces, not implementations"是什么意思?