我读了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 已解决后对生成器函数执行“下一步”。大脑卡住!
最佳答案
如果我错了请更正:
- 第一次调用 onFulfilled()(spawn 函数中的最后一行代码)将执行带参数“next”的继续函数。
- verb 值为 'next',因此通过
result = generator[verb](arg);
调用生成器函数的 'next'
- 现在我们在 link 中看到生成器函数返回一个 promise
let story = yield getJSON('story.json');
- result.value 将被设置为 Promise(或者如果所有 yield 都被调用,则 done 被设置为 True。假设我们还没有完成)
- 由于尚未设置完成,因此将执行这段代码:
} else { return Promise.resolve(result.value).then(onFulfilled, onRejected);}
< - 这会返回一个 promise,当
getJson(story.json)
返回时,它最终会解析。当它解析时,“then”部分的成功处理程序“onFulfilled”被调用。 - onFulfilled() :参见第 1 点:继续对即将到来的 yield 做同样的事情
关于Javascript spawn 如何影响 yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50209685/