yield
和yield*
都是配合Generator进行使用的。express
yield
是关键字,其语法以下:数组
[rv] = yield [expression];复制代码
expression
:是Generator
函数返回的遍历器对象调用next
方法是所获得的值;rv
:是遍历其对象调用next
方法是传递给next方法的参数这里要简单的说一下next
方法,其语法以下:bash
gen.next(value)复制代码
value
:传递给Generator
函数的值,也就是上文中的rv
这里比较有意思的就是传递给next
方法的值value
,下面经过例子来看一下:函数
function* _testYieldExpression(){
let value = '';
value = yield 'yield value';
console.info(`1 value is: ${value}`);//输出1
value = yield 'yield value';
console.info(`2 value is: ${value}`);//输出2
return 'over';
}
let _testIterator = _testYieldExpression();
let _res = _testIterator.next();
console.info(`1:no params to next, result is: ${_res.value}`);//输出3
_res = _testIterator.next('params from next');
console.info(`2:params to next, result is: ${_res.value}`);//输出4
_res = _testIterator.next();
console.info(`3:params to next, result is: ${_res.value}`);//输出512345678910111213141516171819复制代码
输出以下:ui
1:no params to next, result is: yield value
1 value is: params from next
2:params to next, result is: yield value
2 value is: undefined
3:params to next, result is: over12345复制代码
注释中标记了几个输出语句,spa
next
方法是执行,能够看到,此时的
value
值是传递给
next
方法的参数,可是在
_testYieldExpression
函数中能够看到
value = yield 'yield value'
,因此能够理解为,在第一次执行
next
函数的时候,语句
yield 'yield value'
没有返回值,而且没有赋值给
value
,而在第二次调用
next
时,才将
next
函数的参数赋值给value。虽然有些混乱,可是若是打断点来看的话会更加清晰。
yield*
是表达式,所以又返回值,其语法以下:code
yield* [[expression]];1复制代码
expression
:是可遍历对象,能够是数组,也能够是另一个Generator
函数的执行表达式,等等对象
其实说简单点,就是将多个yield
语句根据某种规则合并为一个,示例以下:string
function* g3() {
yield* [1, 2];
yield* '34';
yield* Array.from(arguments);
}
var iterator = g3(5, 6);
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: "3", done: false}
console.log(iterator.next()); // {value: "4", done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}复制代码