【发布时间】:2016-06-01 06:11:57
【问题描述】:
我正在研究一个 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 本身并不能理解 Promise,不是吗?我还假设调用:
storakleShopifyApi.exchangeTemporaryToken(parameters);
返回:
IteratorResult {value: Promise..., done: true}
那么yield是如何处理这个问题的,并将promise中的resolved值赋给accessToken变量呢?
【问题讨论】:
-
不,yield 不知道它正在产生什么,无论是承诺还是其他任何东西。但是yield的消费者是koa框架,它确实知道yield的值是一个promise,等待它解析,然后在下一次调用@时将结果值传递回生成器987654326@,它的作用是使其成为收益的“值”,因此分配给
accessToken。这种行为是 koa 的核心。
标签: javascript node.js generator koa