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
  }
}

执行结果

1
2
3
1
2
undefined

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 }