通过数组异步循环

时间:2021-04-01 19:11:28

标签: javascript loops asynchronous reduce

我有以下代码:

var obj = {
   "slot1": ["1", "2"],
   "slot2": ["7", "5"],
   "slot3": ["12", "213"],
};

for (var key of Object.keys(obj )) {
   obj[key].reduce((chain, user_id) => {
    return chain
    .then(() => async_things_happen)
    .then(result => {
        other_things_happen
    });
  }, Promise.resolve()).then(() => {

  });
}

如您所见,这是行不通的。所以for循环的内容工作得很好。它遍历数组并运行良好,但 for 循环本身就是问题所在。在转到下一个键之前,如何让 for 循环等待内部内容完成?
时间表应如下所示:key(slot1) --> .reduce stuff --> key(slot2) --> .reduce stuff --> key(slot3) --> .reduce stuff --> fire finish
我尝试了许多不同的结构,但找不到解决方案。

添加

async function test(obj) {
  return dosomething.then(()=> {
    return Object.keys(obj).reduce((chain, key) => {
      return chain.then(() => {
        return obj[key].reduce((chain, user_id) => {
            return chain.then(() => {dosomething})
        }, Promise.resolve());
      }, Promise.resolve());
    }).then(() => {
      console.log("LOOPED TROUGH ALL KEYS AND ARRAYS");
    });
  });
} 

提前致谢,
菲利普。

1 个答案:

答案 0 :(得分:2)

您的内循环 .reduce 策略很好,但外循环仍然是同步的,并且同时为每个键启动一个承诺链。将同样的事情应用到外循环:

Object.keys(obj).reduce((chain, key) => {
    return chain.then(() => {
        return obj[key].reduce((chain, user_id) => {
            return chain.then(() => asyncStuff())
        }, Promise.resolve())
}, Promise.resolve())

或者使用 async/await 它会变成一个更友好的循环:

for (var key in obj) {
    for (var user_id of obj[key]){
        await asyncStuff()
    }
}
相关问题