通过数组异步循环
Loop asynchronosly through array
我有以下代码:
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");
});
});
}
提前致谢,
菲利普
你的 .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()
}
}
我有以下代码:
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");
});
});
}
提前致谢,
菲利普
你的 .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()
}
}