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不是一个函数