javascript - 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:
我刚刚阅读了有关生成器模式的更多信息,并试图了解它如何适应上述内容。我很困惑
- 结果=生成器动词;
在最后
var generator = generatorFunc(); var onFulfilled = continuer.bind(continuer, "next"); var onRejected = continuer.bind(continuer, "throw"); 返回 onFulfilled(); }
编辑 2
我想我已经想通了 - 它允许生成器函数产生承诺,然后包装器生成函数只会在先前返回的(产生的)承诺解决后才在生成器函数上执行“下一个”。大脑冻结!
解决方案
如果我错了,请纠正:
- 第一次调用 onFulfilled()(spawn 函数中的最后一行代码)将执行带有参数“next”的 continuer 函数。
- 动词值为'next',因此生成器函数的'next'通过调用
result = generator[verb](arg);
- 现在正如我们在链接中看到的,生成器函数返回一个承诺
let story = yield getJSON('story.json');
- result.value 将设置为 Promise(或者如果调用了所有 yield,则 done 设置为 True。假设我们还没有完成)
- 由于尚未设置完成,因此将执行这段代码:
} else { return Promise.resolve(result.value).then(onFulfilled, onRejected);}
- 这会返回一个承诺,最终将在何时
getJson(story.json)
返回。当它解析时,“then”部分的成功处理程序“onFulfilled”被调用。 - onFulfilled() :见第 1 点:继续对即将到来的产量做同样的事情
推荐阅读
- typescript - Notepad++ 中的打字稿支持
- amazon-web-services - 设置 CDC 应用程序时,Lambda 是正确的选择吗
- ios - SwiftUI 项目被 AppStore 拒绝,原因是不断出现空白屏幕
- python - 如何在自定义 Keras 模型函数中共享层权重
- bots - 不和谐机器人问候消息
- excel - Excel 中是否有与嵌套 IF(ISNUMBER(SEARCH) 函数相同的可扩展函数?
- flutter - 当一个区域在 10 秒内被触摸 5 次时,如何在 Dart/Flutter 中编码以启用我的调试模式
- django - 将 Django 响应的返回类型设置为对象列表
- npm - 登录 MyGet 以获取 GitHub Actions 以安装 Private 包
- recursion - 将嵌套的可区分联合表达式转换为字符串