为什么generator' .next需要setTimeout?

时间:2015-10-02 14:43:53

标签: javascript generator ecmascript-6 yield

我正在尝试使用ES6的生成器函数和yield语句Example

function run(generator) {
  var itr = generator(resume);

  function resume(callbackValue) {
    itr.next(callbackValue);
  }
  itr.next();
}

function* main(resume) {
  var result1 = yield add(1, resume);
  var data1 = result1;
  console.log("add 1 = ", data1)
  var data2 = yield add(1, resume);
  console.log("add 1 = ", data2);
  var data3 = yield add(data1, resume);
  console.log("add data1 =", data3);
  console.log("total is ", data1 + data2 + data3);
}

function add(num, resume) {
  setTimeout(function() {
    resume(num + 1);
  }, 0);
}

run(main);

我计划将yield用作异步REST调用的流控制,其中请求会在响应后调用next,但是现在我只使用简单的添加函数。它按计划工作,这是令人兴奋的,但简历只适用于setTimeout,我不知道为什么。 如果它只是:

function add (num, resume) {
    resume(num + 1);
} 
解释器给了我' Generator已经在运行'。

在超时时间内不需要实际等待,我也尝试了自我调用功能,但这并没有帮助。为什么itr.next()需要超时?

1 个答案:

答案 0 :(得分:3)

正如其他评论者所说,当resume表达式仍在解析时,您正试图致电yield。异步调用itr.next将允许yield表达式完成,然后在完成后立即调用itr.next。要让它以您想要的方式工作,只需更改run

function run(generator) {
  var itr = generator(resume);

  function resume(callbackValue) {
    setTimeout(function(){
      itr.next(callbackValue);
    }, 0);
  }
  itr.next();
}

这是一个非常有趣的想法,可以actually be useful