Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过数组异步循环_Javascript_Loops_Asynchronous_Reduce - Fatal编程技术网

Javascript 通过数组异步循环

Javascript 通过数组异步循环,javascript,loops,asynchronous,reduce,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((chai

我有以下代码:

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");
    });
  });
} 
提前感谢,

filip.

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

内部循环的
.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()
    }
}

嘿,谢谢你的回答。所以我玩了一点async和await的解决方案,我最喜欢,但不幸的是,我不能在我的特殊情况下使用await,所以我必须完全理解您的第一个代码片段。我在帖子中添加了一个代码示例。你能看一下吗?我总是得到错误:
TypeError:chain.then不是一个函数
嘿,谢谢你的回答。所以我玩了一点async和await的解决方案,我最喜欢,但不幸的是,我不能在我的特殊情况下使用await,所以我必须完全理解您的第一个代码片段。我在帖子中添加了一个代码示例。你能看一下吗?我总是得到错误:
TypeError:chain.then不是一个函数