【问题标题】:Bluebird promisify and callback with no error argumentBluebird 承诺和回调,没有错误参数
【发布时间】:2014-08-03 09:25:29
【问题描述】:

我正在尝试承诺不使用 callback(err, data) 模式的第 3 方库。相反,它们总是在出错时返回 callback(data)throw

Promise.promisifyAll(horse);

var p = Promise.defer();
horse.drinkAsync()
    .error(function(data)
    {
        p.fulfill(data);
    })
    .catch(function (err)
    {
        console.error('error occured', err);
    });

return p.promise;

有什么好的方法可以用 Promise 包装这样的行为并且仍然让它看起来没问题并允许捕获抛出的错误? catch 子句未触发,应用程序崩溃。

【问题讨论】:

  • 他们throw 出错了?!?什么图书馆?他们总是同步抛出吗?
  • 注意延迟的反模式,你可以return horse.drinkAsync() 另一个反模式是捕获错误只是为了记录它们,这意味着你不知道如何在这段代码中处理它们,这意味着你应该让它冒泡,直到它到达你知道如何处理它的层(为用户打印“出现问题”等)。即使您不想通知用户,手动记录仍然没有用,因为未处理的错误会自动记录。

标签: node.js promise bluebird


【解决方案1】:

从 Bluebird 2.1 开始,您现在可以使用自定义承诺处理程序自定义 promisifyAll

function noErrPromisifier(originalMethod){
    return function promisified() {
         var args = [].slice.call(arguments); // might want to use smarter
         var self = this                      // promisification if performance critical
         return new Promise(function(resolve,reject){
             args.push(resolve); 
             originalMethod.apply(self,args); // call with arguments
         });
    };
}

var horse = Promise.promisifyAll(require("horse"), {
    promisifier: noErrPromisifier
});

horse.drinkAsync().then(function(data){
     // Can use here, ow promisified normally.
});

如果原始方法以异步方式抛出,则确实无法将其包装在域中,尽管我从未见过表现不佳的库

【讨论】:

  • noErrPromsifier 函数中存在语法错误。
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 2014-07-05
  • 2016-07-27
  • 2013-10-26
  • 2017-04-08
  • 1970-01-01
  • 2019-06-10
  • 2017-04-02
相关资源
最近更新 更多