首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在现代Javascript中"await“会中断或终止for循环?

为什么在现代Javascript中"await“会中断或终止for循环?
EN

Stack Overflow用户
提问于 2017-09-15 23:12:43
回答 1查看 1.2K关注 0票数 1

我有以下函数。它获取一个属性数组,并在循环中迭代这些属性,将每个属性放入数据库中。但是这个循环将被await语句自动终止:

代码语言:javascript
复制
async function importAttributeRecords(attributeValues, languageId, attributes, dataStorage, tx) {
  for(let attr of attributes) {
    console.log("Persist", attr)
    try {
      await importAttributeRecord(attributeValues, languageId, attr, dataStorage, tx) 
    }
    catch(err) {
      console.log(err);
    }
    console.log("After persisting");
  }
}

await的第一个调用将被执行,但它之后的第二个console.log语句将永远不会出现。此外,循环将立即退出。

即使返回promise,我如何在循环中同步执行像importAttributeRecord()这样的函数?为什么使用"await“for Loops是危险的?

EN

回答 1

Stack Overflow用户

发布于 2017-09-15 23:35:18

这可以被描述为“类别错误”。for循环本质上是一种同步编程思想,在数组或其他索引实体中(通常)逐个执行每件事,每次都等待。

async实现的异步编程是一种不同的方法。使用它的最完美的方式就是表达前情景和后情景之间的关系,并让语言处理时间和可能的并发或并行执行。

对于这种情况,您可以这样做:

代码语言:javascript
复制
async function importAttributeRecords(attributeValues, languageId, attributes, dataStorage, tx) {
  return Promise.all(attributes.map(attr => {
    console.log("Initiate persist", attr);
    return importAttributeRecord(attributesValues, languageId, attr, dataStorage, tx).then(result => {
      console.log("After persisting", attr, result);
    }).catch(err => {
      console.log("Error: ", attr, err);
    }));
  });
}

您将注意到,importAttributeRecords现在返回一个Promise数组,因此它是合法的async。你还会看到这段代码稍微短了一点!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46242726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档