【问题标题】:Javascript how spawn works for yieldJavascript spawn 如何为产量工作
【发布时间】:2018-10-16 23:50:01
【问题描述】:

我从阿奇博尔德那里读到了this link。关于 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:

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

  • result = generatorverb;
  • 最后

    var 生成器 = generatorFunc(); var onFulfilled = continuer.bind(continuer, "next"); var onRejected = continuer.bind(continuer, "throw"); 返回 onFulfilled(); }

编辑 2

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    如果我错了,请纠正:

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

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2022-08-13
      • 2011-12-16
      • 2019-03-25
      • 2014-01-07
      • 2013-01-29
      • 1970-01-01
      • 2013-04-23
      相关资源
      最近更新 更多