5
5
// 迭代器带有一个内部指针,来指向集合中某个值的位置。当 next() 方法调用后,指针下一位置的值会被返回
6
6
7
7
function createIterator ( items ) {
8
- let i = 0 ;
9
- return {
10
- next : function ( ) {
11
- let done = ( i >= items . length ) ;
12
- let value = ! done ? items [ i ++ ] : undefined ;
13
-
14
- return {
15
- done,
16
- value
17
- }
18
- }
19
- }
8
+ let i = 0 ;
9
+ return {
10
+ next : function ( ) {
11
+ let done = i >= items . length ;
12
+ let value = ! done ? items [ i ++ ] : undefined ;
13
+
14
+ return {
15
+ done,
16
+ value
17
+ } ;
18
+ }
19
+ } ;
20
20
}
21
21
22
- let iterator = createIterator ( [ 1 , 2 , 3 ] ) ;
22
+ let iterator = createIterator ( [ 1 , 2 , 3 ] ) ;
23
23
// console.log(iterator.next());
24
24
// console.log(iterator.next());
25
25
// console.log(iterator.next());
26
26
// console.log(iterator.next());
27
27
28
-
29
28
//**************************************************************************** */
30
29
// Generator
31
30
// 返回迭代器的函数。生成器函数由 function 关键字和之后的星号(*)标识,同时还能使用新的 yield 关键字。
32
31
// 星号的位置不能论是放在 function 关键字的后面还是在它们之间插入空格都是随意的。
33
32
34
- function * createGenerator ( ) {
35
- yield 1 ;
36
- yield 2 ;
37
- yield 3 ;
33
+ function * createGenerator ( ) {
34
+ yield 1 ;
35
+ yield 2 ;
36
+ yield 3 ;
38
37
}
39
38
40
39
let iterator2 = createGenerator ( ) ;
@@ -43,131 +42,121 @@ let iterator2 = createGenerator();
43
42
// console.log(iterator2.next().value);
44
43
// console.log(iterator2.next().value);
45
44
46
-
47
45
//**************************************************************************** */
48
46
// Generator函数表达式
49
47
// 无法使用箭头函数来创建生成器。
50
48
51
- let createGenerator2 = function * ( items ) {
52
- for ( let i = 0 ; i < items . length ; i ++ ) {
53
- yield items [ i ] ;
54
- }
55
- }
56
-
57
-
49
+ let createGenerator2 = function * ( items ) {
50
+ for ( let i = 0 ; i < items . length ; i ++ ) {
51
+ yield items [ i ] ;
52
+ }
53
+ } ;
58
54
59
55
//**************************************************************************** */
60
56
// 可迭代类型与 for-of
61
57
// 可迭代类型是指那些包含 Symbol.iterator 属性的对象
62
58
63
59
let values = [ 1 , 2 , 3 ] ;
64
60
for ( let num of values ) {
65
- console . log ( num ) ;
61
+ console . log ( num ) ;
66
62
}
67
63
// 0, 1, 2
68
64
69
-
70
65
// 访问默认迭代器
71
66
// let iter = values[Symbol.iterator]();
72
67
73
68
// console.log(iter.next());
74
69
75
70
function isIterable ( object ) {
76
- return typeof object [ Symbol . iterator ] === 'function' ;
71
+ return typeof object [ Symbol . iterator ] === 'function' ;
77
72
}
78
73
79
-
80
74
//**************************************************************************** */
81
75
// 创建可迭代类型
82
76
let collection = {
83
- items : [ ] ,
84
- * [ Symbol . iterator ] ( ) {
85
- for ( let item of this . items ) {
86
- yield item ;
87
- }
88
- }
89
- }
77
+ items : [ ] ,
78
+ * [ Symbol . iterator ] ( ) {
79
+ for ( let item of this . items ) {
80
+ yield item ;
81
+ }
82
+ }
83
+ } ;
90
84
91
85
collection . items . push ( 1 ) ;
92
86
collection . items . push ( 2 ) ;
93
87
collection . items . push ( 3 ) ;
94
88
95
89
for ( let x of collection ) {
96
- console . log ( x ) ;
90
+ console . log ( x ) ;
97
91
}
98
92
99
-
100
-
101
93
//**************************************************************************** */
102
94
// 生成器代理
103
95
104
- function * createNumberIterator ( ) {
105
- yield 1 ;
106
- yield 2 ;
96
+ function * createNumberIterator ( ) {
97
+ yield 1 ;
98
+ yield 2 ;
107
99
}
108
100
109
- function * createColorIterator ( ) {
110
- yield 'red' ;
111
- yield 'green' ;
101
+ function * createColorIterator ( ) {
102
+ yield 'red' ;
103
+ yield 'green' ;
112
104
}
113
105
114
- function * createCombinedIterator ( ) {
115
- yield * createNumberIterator ( ) ;
116
- yield * createColorIterator ( ) ;
117
- yield true ;
106
+ function * createCombinedIterator ( ) {
107
+ yield * createNumberIterator ( ) ;
108
+ yield * createColorIterator ( ) ;
109
+ yield true ;
118
110
}
119
111
120
112
const iterator3 = createCombinedIterator ( ) ;
121
- console . log ( iterator3 . next ( ) ) ; // "{ value: 1, done: false }"
122
- console . log ( iterator3 . next ( ) ) ; // "{ value: 2, done: false }"
123
- console . log ( iterator3 . next ( ) ) ; // "{ value: "red", done: false }"
124
-
125
-
113
+ console . log ( iterator3 . next ( ) ) ; // "{ value: 1, done: false }"
114
+ console . log ( iterator3 . next ( ) ) ; // "{ value: 2, done: false }"
115
+ console . log ( iterator3 . next ( ) ) ; // "{ value: "red", done: false }"
126
116
127
117
//**************************************************************************** */
128
118
// 运行异步任务
129
119
130
120
function run ( taskDef ) {
131
- // 创建迭代器,使它们可以在别处使用
132
- let task = taskDef ( ) ;
133
-
134
- // 任务开始执行
135
- let result = task . next ( ) ;
136
-
137
- // 递归函数持续调用 next()
138
- function step ( ) {
139
- if ( ! result . done ) {
140
- // result = task.next();
141
- // result = task.next(result.value);
142
-
143
- if ( typeof result . value === 'function' ) {
144
- result . value ( ( err , data ) => {
145
- if ( err ) {
146
- result = task . throw ( err ) ;
147
- return ;
148
- }
149
-
150
- result = task . next ( data ) ;
151
- step ( ) ;
152
- } ) ;
153
- } else {
154
- result = task . next ( result . value ) ;
155
- step ( ) ;
156
- }
157
- }
158
- }
159
-
160
- // 开始递归
161
- step ( ) ;
121
+ // 创建迭代器,使它们可以在别处使用
122
+ let task = taskDef ( ) ;
123
+
124
+ // 任务开始执行
125
+ let result = task . next ( ) ;
126
+
127
+ // 递归函数持续调用 next()
128
+ function step ( ) {
129
+ if ( ! result . done ) {
130
+ // result = task.next();
131
+ // result = task.next(result.value);
132
+
133
+ if ( typeof result . value === 'function' ) {
134
+ result . value ( ( err , data ) => {
135
+ if ( err ) {
136
+ result = task . throw ( err ) ;
137
+ return ;
138
+ }
139
+
140
+ result = task . next ( data ) ;
141
+ step ( ) ;
142
+ } ) ;
143
+ } else {
144
+ result = task . next ( result . value ) ;
145
+ step ( ) ;
146
+ }
147
+ }
148
+ }
149
+
150
+ // 开始递归
151
+ step ( ) ;
162
152
}
163
153
164
-
165
154
// 例子
166
155
run ( function * ( ) {
167
- console . log ( 'start mission' ) ;
168
- yield ;
169
- console . log ( 'kill the boss' ) ;
170
- yield ;
171
- console . log ( 'mission completed' ) ;
172
- yield ;
173
- } )
156
+ console . log ( 'start mission' ) ;
157
+ yield ;
158
+ console . log ( 'kill the boss' ) ;
159
+ yield ;
160
+ console . log ( 'mission completed' ) ;
161
+ yield ;
162
+ } ) ;
0 commit comments