javascript - 通过数组异步循环
问题描述
我有以下代码:
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()
}
}
推荐阅读
- python - 如何在python3的`keras`中调用`one_hot`?
- perl - 如何在 Coro 中使用“Net::http”?
- user-interface - 我们如何在 gui 中而不是在控制台中打印代码的输出?
- php - AwsS3Adapter 异常出现在本地但不在开发服务器中
- firebase - 如何打印有意义的 firebase-dart 异常
- python - 在 MultinomialNB 中选择重要特征时出错
- sql - 如何重复字符串中的字符
- javascript - 在 React 中设置选定值的选项标签
- sql-server - 如何在登录 SQL 触发器中获取数据库名称
- mysql - 需要获取日期,并获取从 mysql 预订了多少小时的日期