【问题标题】:Wrap Bluebird promise in mPromise在 mPromise 中包装 Bluebird Promise
【发布时间】:2023-03-31 17:34:01
【问题描述】:

我在整个服务中使用 mPromise,为了保持一致的接口(即 ex 的 end()),我需要在其中包装一个 promisfied Bluebird 函数 - 虽然我对 mPromise 不太熟悉,但我也不是成功。这是我所拥有的:

var p = new mPromise();
p.chain(Bluebird.promisify(easypost.Address.create_and_verify, easypost.Address)(params.recipient)
    .then(function(res) {
      return p.resolve(res);
    }, function(err) {
      return p.reject(err);
    });
)
return p;

这是一个做作但一般的想法。这会产生这个错误:

[TypeError: Cannot call method 'bind' of undefined]

【问题讨论】:

    标签: mongoose promise bluebird


    【解决方案1】:

    您无需在 mPromises 中包含 bluebird 承诺。

    Mongoose 中的 Promise 符合 Promises/A+ 标准,bluebird Promise 也是如此 - 您可以简单地混合和匹配它们,并且保证它们的行为一致。您可以在需要 mPromises 的地方传递 bluebird promise,反之亦然。

    也就是说 - 我会反其道而行之,并承诺 Mongoose.prototype,因为 bluebird 承诺易于调试且速度更快。

    如果你必须 - 你可以这样做:

    var p = new mPromise();
    p.fulfill().chain(bluebirdPromise);
    

    另外,不要为每个请求调用promisify - 这很昂贵 - 每个原型都调用一次。

    【讨论】:

    • 谢谢。我想包装的原因是因为每个库都使用自己的承诺扩展,而 mPromise 有 end() 而 Bluebird 没有。我正在研究一些曾经是 Mongoose 的东西,因此使用了 end。虽然现在我想我可能会重新审视并选择标准。
    • 即使有 mPromise,使用 Bluebird 包装 Mongoose 是否有价值?
    • 在 bluebird 中,就像在 Q 和其他库中一样,.end 被称为 .done,尽管 bluebird 会在您自己有未处理的拒绝时发现并报告它,因此事情会按您预期的那样工作如果您忘记了done,它的速度也快了大约 100 倍,具有较长的堆栈跟踪和更好的支持 - 所以是的,我会说如果您没有其他理由坚持承诺,最好使用 bluebird。 @亚舒亚
    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多