Notes

JavaScript Generator 消息传递系统

参数传入

function *foo(x, y) {
  return x * y;
}

const it = foo(6, 7);
const result = it.next();
console.log(result.value);

生成器的数据输入与输出

function *foo(x) {
  const y = x * (yield);
  return y;
}

const it = foo(6);
it.next();

const result = it.next(7);
console.log(result.value);

在这里,函数体中的 yield 与调用时的 next 两个方法,共同构成了生成器的双向消息传递的机制

当函数体中含有 yield 时,即不是立即返回的 return , 那么,当我们调用了函数,获取到迭代器对象后,若需要获取到结果,则至少需要调用两次 next 方法

function *foo(x) {
  const y = x * (yield 'hello'); // 在 yield 时,同时会返回 hello 字符串
  return y;
}

const it = foo(6); // 传入参数 x = 6,获取到迭代器对象
let res = it.next(); // 第一次调用 next, 函数体运行到 yield 处暂停,同时,函数体将会返回 yield 后的数据
console.log(res.value); // hello

res = it.next(7); // 第二次调用 next, 函数体从上次暂停的地方继续进行,同时,7 将会代入到函数体中 yield 的位置
console.log(res.value); // 6 * 7 = 42