《深入理解ES6》阅读随笔
迭代器传参
在调用 next() 方法时,可以传递一个参数,该参数可以在上一个 yield 的返回值中得到:
// 迭代器传参
console.log("------ 迭代器传参 ------");
function* iteraterSendHelper() {
let first = yield 1;
let second = yield first + 2;
let third = yield second + 3;
}
const sender = iteraterSendHelper();
console.log(sender.next()); // { value: 1, done: false }
console.log(sender.next(10)); // { value: 12, done: false }
console.log(sender.next(20)); // { value: 23, done: false }
console.log(sender.next(30)); // { value: undefined, done: true }
迭代器异常处理
在使用迭代器实例过程中,如果遇到异常,可以将该异常抛出,然后在生成器中进行异常捕获:
// 生成器异常处理
console.log("------ 生成器异常处理 ------");
function* iteraterThrowHelper() {
let first = yield 1;
let second;
try {
second = yield first + 2;
} catch (error) {
console.log(error)
second = 10;
}
yield second;
}
const thrower = iteraterThrowHelper();
console.log(thrower.next()); // { value: 1, done: false }
console.log(thrower.next(2)); // { value: 4, done: false }
console.log(thrower.throw(new Error("iteraterThrowHelper err"))); // { value: 10, done: false }
console.log(thrower.next()); // { value: undefined, done: true }
在上面 second 步骤如果没有使用 try catch 进程异常捕获,那么程序就会由于异常调用而终止运行;
生成器返回值
在定义生成器时,在所有 yield 都执行完毕以后,也可以像函数一样,返回一个结果,该结果会在调用 next() 后 done 第一次为 true 时在 value 中得到,如果没有任何返回值或者直接返回不带值,那么此时 value 为 undefined;在生成器中设置返回后,之后的 yield 同时全部失效:
// 生成器返回值
console.log("------ 迭代器返回值 ------");
function* iteraterReturnHelper() {
yield 1;
return "1";
yield 2;
yield 3;
}
const returner = iteraterReturnHelper();
console.log(returner.next()); // { value: 1, done: false }
console.log(returner.next()); // { value: "1", done: false }
console.log(returner.next()); // { value: undefined, done: true }
console.log(returner.next()); // { value: undefined, done: true }
委托生成器
在生成器中,还可以像函数调用一样,调用另一个生成器,也就是所谓的委托生成器:
// 委托生成器
console.log("------ 委托生成器 ------");
function* p1() {
yield 1;
yield 2;
}
function* p2() {
yield "3";
yield "4";
}
function* iteraterProxyHelper() {
yield* p1();
yield* p2();
}
const proxy = iteraterProxyHelper();
console.log(proxy.next()); // { value: 1, done: false }
console.log(proxy.next()); // { value: 2, done: false }
console.log(proxy.next()); // { value: "3", done: false }
console.log(proxy.next()); // { value: "4', done: false }
console.log(proxy.next()); // { value: undefined, done: true }
网友评论