【问题标题】:Koa.js yield value with a race conditionKoa.js 在竞争条件下产生价值
【发布时间】:2016-01-04 10:54:24
【问题描述】:

我有一个使用 koa.js 的应用程序,对于上下文,我正在连接一个不严格遵循请求/响应模式的外部系统。 IE。在“请求”之后,它可能会或可能不会回答。

我能够将我的请求与这些响应相匹配,但是我无法将其放入 koa.js 响应中:

r.get('/...', *function() {

    // (1) cannot yield since it will block and never call (2) ?
    callbacks.storeCb(howToMatchAnEventualResponse, function(err, resp) {  // may never get called depending about how the external system answers
        console.log("I should answer the http req now"); // how to answer the request from here ?
    });

    // has to be done after storingCb, this may or may not trigger the callback above
    externalSystem.sendMessage(msg); // (2)

    // something similar will have to be done in the callback instead
    this.body = {
        success : true,
        response : ''
    };

});

所以我的问题是,如何在我的回调(或类似的东西)中使用 koa 回答 http 请求,以及如何在未调用回调时发送一个空答案(即,可能在延迟之后)?

我猜我正在寻找类似于Promise.race() 的东西,但是对于koa,所以使用yield

【问题讨论】:

    标签: javascript node.js koa co


    【解决方案1】:

    最后我可以使用bluebird'sPromise.race()

    我仍然会对使用生成器的解决方案感兴趣。

    【讨论】:

    • Koa 中的生成器抽象主要用于简化路由逻辑(即处理请求),而不是您必须使用的抽象来解决每个问题(它不能)。 “Koa 方式”实际上是将您更复杂的异步逻辑与返回承诺的函数包装起来,然后在您的路线中产生它们(在您的情况下为Promise.race())。这样一来,您就可以将复杂性排除在路由之外,但您还可以编写简单的基于回调的异步代码来解决问题。将生成器视为您在路由处理程序中使用的主要工具。
    • 两件事:1) Promise.race 在 ES2015 和 Bluebird 中都存在 2) Bluebird 建议使用 BluebirdPromise.any 而不是 BluebirdPromise.race,因为前者甚至将被拒绝的承诺标记为“赢家”@987654321 @
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2018-06-03
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多