【问题标题】:how to wrap a promise with bluebird如何用蓝鸟包装承诺
【发布时间】:2017-06-18 23:57:28
【问题描述】:

我将 bluebird 用于承诺,但也使用返回非 bluebird 承诺的库。我想使用.asCallback。我尝试使用Promise.resolve 来包装它,这是我在网上其他地方找到的,但它隐藏了承诺链中的错误。在代码中,如果我取出then/catch,它会解决而不是从客户端调用中抛出错误,即使发生了错误。

除了使用new Promise(resolve,reject) 创建一个新的promise(这是一个显而易见的解决方案)之外,是否有更好的方法将其转换为bluebird promise,一种将任何错误传播到原始promise 链的方法?

module.exports.count = function(params, done){
  var promise = client.count({
    "index": config.search.index + "_" + params.index
  }).then(function(response){
    logger.debug(response);
  }).catch(function(e){
    logger.error(e);
  });
  return Promise.resolve(promise).asCallback(done);

【问题讨论】:

  • 它隐藏了承诺链中的错误”是什么意思? Promise.resolve 当然不会那样做。但是,您的catch() 电话可能会。

标签: javascript promise bluebird


【解决方案1】:

Promise.resolve 确实传播错误。您的问题似乎是catch 在它们到达resolve 之前处理它们。你应该这样做

function count(params, done){
  return Promise.resolve(client.count({
    "index": config.search.index + "_" + params.index
  })).then(function(response){
    logger.debug(response);
    return response; // important!
  }, function(e){
    logger.error(e);
    throw e; // important!
  }).asCallback(done);
}

【讨论】:

  • 也许它是父承诺链中的其他东西。我添加了 catch 只是为了解决它,所以我的代码示例实际上很糟糕。让我再检查一下。
  • 我认为这只是我在父链处理程序中的一个错误。我还在学习如何正确使用 Promise...
猜你喜欢
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2016-09-14
  • 2014-02-13
  • 2014-11-06
  • 2015-02-13
相关资源
最近更新 更多