首页 > 解决方案 > 通过数组异步循环

问题描述

我有以下代码:

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

在此先感谢,
菲利普。

标签: javascriptloopsasynchronousreduce

解决方案


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

推荐阅读