我正在查看 Koa.js/Node.js 应用程序,我认为我对生成器和 promise 有很好的理解。但我无法理解以下代码:
function *parseAuthorization() {
let parameters = this.query;
let accessToken = yield storakleShopifyApi.exchangeTemporaryToken(parameters);
if(accessToken) {
return ...
}
return this.response.redirect("/home/");
};
exchangeTemporaryToken方法如下:
function* exchangeTemporaryToken(query) {
let authApi = getAuthApi(query.shop);
return new Promise(function (resolve, reject) {
authApi.exchange_temporary_token(query, function (err, data) {
if (err) {
return reject(err);
}
return resolve(data['access_token']);
});
});
};
*parseAuthorization 显然是一个生成器函数(在本例中是一个 API 操作),它阻塞在这一行:
let accessToken = yield storakleShopifyApi.exchangeTemporaryToken(parameters);
storakleShopifyApi.exchangeTemporaryToken 是另一个生成器函数,有趣的是它返回一个 Promise。
但是 yield 本身并不能理解 promises,对吗?我还假设调用:
storakleShopifyApi.exchangeTemporaryToken(parameters);
返回:
IteratorResult {value: Promise..., done: true}
那么 yield 如何处理这个问题并将 promise 的解析值分配给 accessToken 变量?
最佳答案
我从没想过超越 Google 搜索结果的第一页有任何值(value),但我想我在那里找到了问题的答案:
http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/
引用这篇文章:
“这就是 Koa 的工作方式——你的应用程序代码是生成器,它发出一系列 promise (或我将在下面展示的其他东西),Koa 等待每个 promise 完成,然后再恢复你的代码(传回给你是上一个任务的结果)。”
所以 Koa 是 yield 和 promises 之间的粘合剂。
关于javascript - yield 如何理解 Node.js/Koa.js 应用程序中的 Promises?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509237/