未验证 提交 2f3601bf 编写于 作者: S steve000 提交者: GitHub

Update 42.md

上级 a21449b2
## 35.同步生成器(高级)
## 35 同步生成器(高级)
> 原文: [http://exploringjs.com/impatient-js/ch_sync-generators.html](http://exploringjs.com/impatient-js/ch_sync-generators.html)
### 35.1什么是同步生成器?
### 35.1 什么是同步生成器?
同步生成器是函数定义和方法定义的特殊版本,它们始终返回同步可迭代:
......@@ -34,7 +34,7 @@ class MyClass {
* 功能:伪关键字`function*`是关键字`function`和星号的组合。
* 方法:`*`是一个修饰符(类似于`static``get`)。
#### 35.1.1生成器函数返回 iterables 并通过`yield`填充它们
#### 35.1.1 生成器函数返回 iterables 并通过`yield`填充它们
如果调用生成器函数,它将返回一个 iterable(实际上:也是可迭代的迭代器)。生成器通过`yield`运算符填充可迭代的:
......@@ -57,7 +57,7 @@ for (const x of genFunc1()) {
// 'b'
```
#### 35.1.2 `yield`暂停生成器功能
#### 35.1.2 `yield`暂停生成器功能
到目前为止,`yield`看起来像是一种向迭代中添加值的简单方法。但是,它做的远不止于此 - 它还会暂停和退出生成器功能:
......@@ -117,7 +117,7 @@ assert.equal(location, 3);
这次,`.next()`的结果的属性`.done``true`,这意味着可迭代完成。
#### 35.1.3为什么`yield`暂停执行?
#### 35.1.3 为什么`yield`暂停执行?
`yield`暂停执行有什么好处?为什么它不像 Array 方法`.push()`那样工作并用值填充 iterable - 没有暂停?
......@@ -164,7 +164,7 @@ assert.deepEqual(
`exercises/generators/fib_seq_test.js`
#### 35.1.4示例:迭代迭代
#### 35.1.4 示例:迭代迭代
以下函数`mapIter()`类似于`Array.from()`,但它返回一个可迭代的,而不是一个数组,并根据需要生成其结果。
......@@ -185,9 +185,9 @@ assert.deepEqual([...iterable], ['aa', 'bb']);
`exercises/generators/filter_iter_gen_test.js`
### 35.2从生成器调用生成器(高级)
### 35.2 从生成器调用生成器(高级)
#### 35.2.1通过`yield*`调用生成器
#### 35.2.1 通过`yield*`调用生成器
`yield`只能直接在生成器中工作 - 到目前为止,我们还没有看到将屈服委托给另一个函数或方法的方法。
......@@ -242,7 +242,7 @@ assert.deepEqual(
[...gen()], [1, 2]);
```
#### 35.2.2示例:在树上迭代
#### 35.2.2 示例:在树上迭代
`yield*`允许我们在生成器中进行递归调用,这在迭代递归数据结构(如树)时很有用。举例来说,二叉树的数据结构如下。
......@@ -292,11 +292,11 @@ for (const x of tree) {
`exercises/generators/iter_nested_arrays_test.js`
### 35.3示例:重用循环
### 35.3 示例:重用循环
生成器的一个重要用例是提取和重用循环功能。
#### 35.3.1要重用的循环
#### 35.3.1 要重用的循环
作为一个例子,考虑以下函数迭代文件树并记录它们的路径(它使用 [Node.js API](https://nodejs.org/en/docs/) 这样做):
......@@ -317,7 +317,7 @@ logFiles(rootDir);
我们如何重用这个循环来做除记录路径之外的其他事情?
#### 35.3.2内部迭代(推送)
#### 35.3.2 内部迭代(推送)
重用迭代代码的一种方法是通过 [_ 内部迭代 _](ch_arrays.html#external-iteration-internal-iteration) :将每个迭代值传递给回调(A 行)。
......@@ -337,7 +337,7 @@ const paths = [];
iterFiles(rootDir, p => paths.push(p));
```
#### 35.3.3外部迭代(拉)
#### 35.3.3 外部迭代(拉)
另一种重用迭代代码的方法是通过 [_ 外部迭代 _](ch_arrays.html#external-iteration-internal-iteration) :我们可以编写一个生成所有迭代值的生成器。
......@@ -356,7 +356,7 @@ const rootDir = process.argv[2];
const paths = [...iterFiles(rootDir)];
```
### 35.4生成器的高级功能
### 35.4 生成器的高级功能
* `yield`也可以通过`.next()` _ 接收 _ 数据。有关详细信息,请参阅[“探索 ES6”](http://exploringjs.com/es6/ch_generators.html#sec_generators-as-observers)
* `yield*`的结果是其操作数返回的结果。有关详细信息,请参阅[“探索 ES6”](http://exploringjs.com/es6/ch_generators.html#_recursion-via-yield)
\ No newline at end of file
* `yield*`的结果是其操作数返回的结果。有关详细信息,请参阅[“探索 ES6”](http://exploringjs.com/es6/ch_generators.html#_recursion-via-yield)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册