20200422

@xiaojingzhao

Plan

  • 你不知道的 js - 第三章 代码组织

Notes

生成器 -- 提前完成

  • returnthrow 都能终止生成器
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
}

More