我有以下代码:
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");
});
});
}
提前致谢,
菲利普。
答案 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()
}
}