首页 > 解决方案 > Javascript spawn 如何为产量工作

问题描述

我从阿奇博尔德那里读到了这个链接。关于 Promises 的详细信息,一切都很清楚,除了 spawn 函数:

function spawn(generatorFunc) {
  function continuer(verb, arg) {
    var result;
    try {
      result = generator[verb](arg);
    } catch (err) {
      return Promise.reject(err);
    }
    if (result.done) {
      return result.value;
    } else {
      return Promise.resolve(result.value).then(onFulfilled, onRejected);
    }
  }
  var generator = generatorFunc();
  var onFulfilled = continuer.bind(continuer, "next");
  var onRejected = continuer.bind(continuer, "throw");
  return onFulfilled();
}

我理解意图,但上面的代码不清楚。有人可以解释上面 spawn 函数中发生了什么,它神奇地使 yield 起作用吗?

编辑1:

我刚刚阅读了有关生成器模式的更多信息,并试图了解它如何适应上述内容。我很困惑

编辑 2

我想我已经想通了 - 它允许生成器函数产生承诺,然后包装器生成函数只会在先前返回的(产生的)承诺解决后才在生成器函数上执行“下一个”。大脑冻结!

标签: javascript

解决方案


如果我错了,请纠正:

  1. 第一次调用 onFulfilled()(spawn 函数中的最后一行代码)将执行带有参数“next”的 continuer 函数。
  2. 动词值为'next',因此生成器函数的'next'通过调用result = generator[verb](arg);
  3. 现在正如我们在链接中看到的,生成器函数返回一个承诺let story = yield getJSON('story.json');
  4. result.value 将设置为 Promise(或者如果调用了所有 yield,则 done 设置为 True。假设我们还没有完成)
  5. 由于尚未设置完成,因此将执行这段代码:} else { return Promise.resolve(result.value).then(onFulfilled, onRejected);}
  6. 这会返回一个承诺,最终将在何时getJson(story.json)返回。当它解析时,“then”部分的成功处理程序“onFulfilled”被调用。
  7. onFulfilled() :见第 1 点:继续对即将到来的产量做同样的事情

推荐阅读