yield的使用
参考
http://es6.ruanyifeng.com/#docs/generator#next-%E6%96%B9%E6%B3%95%E7%9A%84%E5%8F%82%E6%95%B0
逐条返回
1
2
3
4
5
6
7
8
9
10
11
12
13
|
let fun01 = function * () {
console.log("run-01");
yield "aa"
console.log("run-02");
yield "bb"
console.log("run-03");
return "cc";
}
let g01 = fun01();
console.log(g01.next());
console.log(g01.next());
console.log(g01.next());
|
执行结果
1
2
3
4
5
6
|
run-01
{ value: 'aa', done: false }
run-02
{ value: 'bb', done: false }
run-03
{ value: 'cc', done: true }
|
每遇到到一个 yield 就返回
嵌套返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
let fun02v1 = function * () {
yield "bb"
return "cc";
}
let fun02v2 = function * () {
yield "aa"
yield* fun02v1()
yield* "xy"
yield* [1,2]
yield* arguments;
return "done";
}
let g02 = fun02v2(3, 4);
let arr = [];
for (var r of g02){
arr.push(r);
}
console.log(arr);
|
执行结果
1
2
3
4
5
|
[
'aa', 'bb', 'x',
'y', 1, 2,
3, 4
]
|
嵌套结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var result ;
let fun03m1 = function * () {
yield* [1, 2];
return "hello";
}
let fun03m2 = function * () {
result= yield* fun03m1()
}
let g03 = fun03m2();
for (var r of g03){
console.log(r);
console.log(result);
}
console.log(result);
|
执行结果
1
2
3
4
5
|
1
undefined
2
undefined
hello
|
最后才轮到result赋值, 细想也的确该这样
for-of 循环遍历时,返回值是
Generator 的状态done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
let fun04 = function * () {
yield* [1, 2];
//return 3; // 放开注释则最后一次打印是3
}
let g04 = fun04();
while(true){
let r= g04.next()
console.log(r.value);
if(r.done){
break
}
}
|
执行结果
yield表达式的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function* fun05() {
for(var i = 0; true; i++) {
var reset = yield i;
console.log(reset);
if(reset) { i = -1; }
}
}
var g05 = fun05();
for (let x = 2; x > 0; x--){
let r = g05.next();
console.log(`r= ${r.value}`);
}
console.log(`r= ${g05.next(true)}`);
|
执行结果
1
2
3
4
5
6
7
|
r= 0
undefined
r= 1
undefined
r= 2
true
r= [object Object]
|
yield 的默认值是 undefined
当next传入参数时,上一个 yield表达式就有值了
验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
let fun06 = function * (x) {
var x1 = x + 10;
// 最好是写成 (yield x1) + 5 或者 yield(x1+5)
var x2 = yield x1 + 5;
var x3 = 2* ( yield(x2+40) );
console.log(`num: ${x1} - ${x2} - ${x3} - ${x}`);
return x1 + x2 + x3 + x;
}
let g06 = fun06(100);
var r6_01 = g06.next();// 115
var r6_02 = g06.next(20); // x2=20 ==> 20+40 ==> 60
var r6_03 = g06.next(200); // x3= 2*200= 400 ==> 110+20+400+100 ==> 630
console.log(r6_01);
console.log(r6_02);
console.log(r6_03);
|
执行结果
1
2
3
4
|
num: 110 - 20 - 400 - 100
{ value: 115, done: false }
{ value: 60, done: false }
{ value: 630, done: true }
|