Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
impatient-js-zh
提交
2f3601bf
I
impatient-js-zh
项目概览
OpenDocCN
/
impatient-js-zh
10 个月 前同步成功
通知
0
Star
266
Fork
38
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
impatient-js-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
2f3601bf
编写于
7月 22, 2019
作者:
S
steve000
提交者:
GitHub
7月 22, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 42.md
上级
a21449b2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
15 deletion
+15
-15
docs/42.md
docs/42.md
+15
-15
未找到文件。
docs/42.md
浏览文件 @
2f3601bf
## 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录