20200422
Plan
- 你不知道的 js - 第三章 代码组织
Notes
生成器 -- 提前完成
return和throw都能终止生成器
function* foo() {
yield 1;
yield 2;
yield 3;
}
var it = foo();
it.next(); // {value: 1, done: false}
it.return(4); // {value: 4, done: true}
it.next(); // {value: undefined, done: true}
finally触发时机
return, 迭代结束都会触发 finally
function* foo() {
try {
yield 1;
yield 2;
yield 3;
} finally {
console.log("FINALLY");
}
}
for (v of foo()) {
console.log(v); // 1,2,3,FINALLY
}
var it2 = foo();
it2.next(); // {value: 1, done: false}
it2.return(4); // FINALLY, {value: 4, done: true}
// throw
var it3 = foo();
it3.next(); // {value: 1, done: false}
it3.throw(4); // FINALLY,Uncaught 4
错误处理
- 在生成器中使用 try...catch
function* foo() {
try {
yield 1;
} catch (e) {
console.log(e);
}
yield 2;
throw "Hi";
}
var it = foo();
it.next(); // {value: 1, done: false}
try {
it.throw("222"); // 222
// {value: 2, done: false}
it.next();
console.log("1111111111"); // 不会执行这一步
} catch (e) {
console.log(e); // Hi
}