Javascript spawn 如何影响 yield

标签 javascript

我读了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 generator = generatorFunc(); var onFulfilled = continuer.bind(continuer, "next"); var onRejected = continuer.bind(continuer, "throw"); 返回 onFulfilled();

编辑 2

我想我已经想到了 - 它允许生成器函数产生 promise ,然后包装器生成函数只会在先前返回(产生的) promise 已解决后对生成器函数执行“下一步”。大脑卡住!

最佳答案

如果我错了请更正:

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

关于Javascript spawn 如何影响 yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50209685/

相关文章:

javascript - JS正则表达式将6位数字转换为dd-dd-dd

javascript - 在字符串的逗号后添加空格

javascript - 似乎无法在 Javascript 中模拟 'unlocks' 的按键并单击 Reddit 'Post' 按钮?

javascript - 需要获取静态文件的状态

javascript - 在另一个 url 中传递 url

javascript - Php 表单不起作用,作为 2 个单独的页面工作,但不是 1 个合并的页面

javascript - 动态添加和删除表单域

javascript - for循环内数组的总和

javascript - 扩展根 vue 实例