【问题标题】:How does yield understand Promises in a Node.js/Koa.js application?yield 如何理解 Node.js/Koa.js 应用程序中的 Promise?
【发布时间】: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


【解决方案1】:

我从没想过超越 Google 搜索结果的第一页有任何价值,但我认为我在那里找到了我的问题的答案:

http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/

引用这篇文章:

“这就是 Koa 的工作原理——你的应用程序代码是生成器,它发出一系列的 Promise(或者我将在下面展示的其他东西),Koa 等待每个完成后才恢复你的代码(传回给你上一个任务的结果)。”

所以 Koa 是 yield 和 promise 之间的粘合剂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2021-11-26
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多