请选择 进入手机版 | 继续访问电脑版

JavaScript中的异步循环for...await...of

前端开发  / Javascript  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2020-3-10

跳转到指定楼层

有几种方法可以遍历 JavaScript中的内容。最值得注意的方法是使用循环。循环结构包括forforEachdo...whilewhilefor...infor...of。所有这些构造都在诸如数组,对象,字符串等同步可迭代对象上循环。

但是,如果要遍历异步可迭代对象,例如读取文件,生成器或实现异步可迭代协议的任何对象,该怎么办?为此,ECMAScript 2015中存在一个特殊的循环构造。输入for...await...of

什么是for...await...of

对... ...的await的语句创建一个循环遍历作为同步iterables异步可迭代的对象,以及如数组,对象,我前面提到的字符串。这是编写这种循环的方法。

var asyncIterable = {
  [Symbol.asyncIterator]: asyncIterator
};

(async function() {
  for await (variable of asyncIterable) {
    //some logic
  }
})();
variable-在每次迭代中,将不同属性的值分配给变量。变量可以与被声明constletvariterable-要迭代其可迭代属性的对象。

所述for...wait...of环路首先创建通过数据源[Symbol.asyncIterator]()。对于每次next()调用,循环都隐式地等待承诺的解决。该承诺由迭代器方法返回。注意这里,因为await使用了它,所以您必须始终在async类似于normal 的函数中使用它await

现在,例如,如果您想读取一个异步操作文件,则可以这样做。

(async function() {
  for await (const line of readLines(filePath)) {
    console.log(line)
  }
})();

让我们使用JavaScript生成器作为一个更现实的示例。

async function* asyncGenerator() {
    var array = ['Hello', 'World'];

    while (array.length) {
      yield await array.shift();
    }
}

(async function() {
  for await (const item of asyncGenerator()) {
    console.log(item);
    // 'Hello'
    // 'World'
  }
})();

这里asyncGenerator是一个异步生成器,它异步返回数组项。在这里,生成器是异步的,因为它与同步生成器不同,它异步返回所有值。该for...wait...of环移动到前等待每个项目的决心next()。在这里,next()也是异步的,它返回承诺。因此,它可以用于await…循环。

转播转播
回复

使用道具

245

主题

248

帖子

857

积分

网站编辑

Rank: 8Rank: 8

积分
857
qqpite 发表于 2020-4-18 15:22:31

很不错的文章

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

admin

管理员

  • 主题

    99

  • 帖子

    101

  • 关注者

    0

手机版|ObjectX 超对象 |粤ICP备20005929号
Powered by  © 2019-2020版权归ObjectX 超对象