1.next()永远都会比yield多一个
2.消息传递
-
当next(..)执行到yield语句处时会暂停生成器的执行,同时next(...)会得到一个带有value属性的对象,yield语句后面带的值会赋给value(如果yield后面没有值,value就为undefined)。可以将yield ...效果看成跟return ...类似。
-
当生成器处于暂停状态时,暂停的yield表达式处可以接收下一个启动它的next(...)传进来的值。当next(...)使生成器继续往下执行时,其传入的值会将原来的yield语句替换掉。
- 第一个next()仅仅是用于启动生成器用的,并不会传入任何东西,如果传入了参数也会被自动忽略掉。
- yield ...在值传递方面的作用相当于return ...,你也可以把它当做一个return语句来看待,如果yield后面不加参数,则默认yield undefined;
- 最后一个next()执行完毕之后,得到的值是*main()函数return出来的值,如果函数没有自己加return语句,一样也会默认return undefined;
- next()执行完毕后会返回一个对象,属性值有两个,分别为value(从yield或return处拿到的值)和done(boolean值,标识生成器是否执行完毕)。
function *main() {
let x1;
let x = yield "starting";
let y = yield (x * 2);
console.log(x, y);
}
let it = main();
let res = it.next('1111'); // '1111'被丢弃啦~~
console.log(res.value); // 输出"starting"
res = it.next(); // 不给yield传值 x成了undefined
console.log(res.value); // 输出NaN (undefined * 2得到了NaN传给next()运行后的对象)
res = it.next(2); // 不给yield传值 y未拿到值
// 输出undefined 2
console.log(res.value); // 输出undefined (默认return undefined;)