帮酷LOGO
  • 显示原文与译文双语对照的内容
Asynchronous Iteration for ECMAScript

  • 源代码名称:proposal-async-iteration
  • 源代码网址:http://www.github.com/tc39/proposal-async-iteration
  • proposal-async-iteration源代码文档
  • proposal-async-iteration源代码下载
  • Git URL:
    git://www.github.com/tc39/proposal-async-iteration.git
  • Git Clone代码到本地:
    git clone http://www.github.com/tc39/proposal-async-iteration
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/tc39/proposal-async-iteration
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • 用于JavaScript的异步迭代器

    概述和动机

    迭代器接口( 在 ECMAScript 2015中引入) 是一个顺序数据访问协议,它支持通用和可以组合数据使用者和转换器的开发。 它们的主接口是一个 next() 方法,它返回 { value, done } 元组,它的中 done 是一个布尔值,指示迭代器的结尾是否已经到达,value 是序列中的值。

    Since迭代器返回的序列和数据源的"已经完成"状态都必须知道,因此迭代器只适用于表示同步数据源。 虽然JavaScript程序员遇到的许多数据源是同步( 例如内存列表和其他数据结构),但其他许多数据源不是。 例如需要使用基于事件的访问的任何数据源通常都使用基于事件的或者基于流的异步服务器端API来表示。 不幸的是,迭代器不能用来表示这样的数据源。

    ( 即使是承诺的迭代器还不够,因为只允许异步确定值,但需要同步地确定"已经完成"状态。)

    为了为异步数据源提供通用的数据访问协议,我们引入了英镑AsyncIterator接口,异步迭代语句( for - await - of ) 和异步生成器函数。

    异步迭代器和异步 iterables

    异步迭代器非常像迭代器,只是它的next() 方法返回一个 { value, done } 对于 above,我们必须返回迭代器结果对的诺,因为迭代器方法返回时,迭代器的下一个值和"已经完成"状态。

    const { value, done } =syncIterator.next();asyncIterator.next().then(({ value, done }) =>/*.. . */);

    另外,我们引入了一个新的符号,用于从给定对象( Symbol.asyncIterator ) 中获取一个异步迭代器。 这允许任意对象公布它们是异步 iterables,类似于允许你公布为一个正常的同步的iterable 。 可能使用这里类的类的示例是可以读流( ) 。

    异步迭代器的概念隐含在请求队列的概念中。 因为在解析前一个请求的结果之前,迭代器方法可以能被调用多次,所以每个方法调用都必须在内部排队。

    异步迭代语句: for - await - of

    我们引入了 for-of 迭代语句的变体,该语句迭代异步iterable对象。 示例用法如下:

    forawait (constlineofreadLines(filePath)) {
     console.log(line);
    }

    只能在异步函数和异步生成器函数( 见 below ) 中允许语句的异步。

    执行期间,将使用 [Symbol.asyncIterator]() 方法从数据源创建一个异步迭代器。

    每次我们访问序列中的下一个值时,我们都会隐式地从迭代器方法返回promise返回。

    异步生成器函数

    异步生成器函数与生成器函数类似,但存在以下差异:

    • 调用异步生成器函数返回一个对象,即异步生成器,它的方法( nextthrowreturn ) 返回 { value, done } 而不是直接返回 { value, done } 这将自动使返回的异步生成器对象成为异步迭代器
    • 允许 await 表达式和 for - await - of 语句。
    • yield*的行为被修改为支持委托到异步 iterables 。

    例如:

    asyncfunction*readLines(path) {
     let file =awaitfileOpen(path);
     try {
     while (!file.EOF) {
     yieldawaitfile.readLine();
     }
     } finally {
     awaitfile.close();
     }
    }

    这个函数返回一个异步生成器对象,它可以使用 for - await - of,如前面的例子所示。

    实现状态

    本机实现




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语