Javascript 承诺-延迟期间包装错误。拒绝

Javascript 承诺-延迟期间包装错误。拒绝,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我正在尝试使用q.js创建一个延迟包装器,这样我就可以在错误(字符串)被then()或fail()中的承诺传回之前,将它们包装在自定义错误类中。这就是我目前正在做的: var getDeferred = function() { var deferred = q.defer(); var reject = deferred.reject; deferred.reject = function(error) { if (!(error instance

我正在尝试使用
q.js
创建一个延迟包装器,这样我就可以在错误(字符串)被
then()
fail()
中的承诺传回之前,将它们包装在自定义错误类中。这就是我目前正在做的:

var getDeferred = function() {

    var deferred = q.defer();

    var reject = deferred.reject;
    deferred.reject = function(error) {

        if (!(error instanceof MyErrorClass))
            error = new MyErrorClass(error)

        return reject.apply(deferred, arguments);
    }

    return deferred;
}
因此,我们的想法是,用户将执行以下操作

var deferred = getDeferred();

deferred.promise.fail(function(err) {
    // err should now be instance of MyErrorClass and NOT a string
})

deferred.reject('A string error')
并期望在
fail()
处理程序中获得
MyErrorClass
,而不是传递给
deferred.reject的字符串


上面的代码可以工作,但并不理想——我知道我不应该对deferred.reject进行猴子补丁。但是有更好的方法吗?

它更漂亮/更注重承诺:

var getDeferred = function() {

    var deferred = q.defer();

    deferred.promise = deferred.promise.then(null, function(error) {
        if (!(error instanceof MyErrorClass))
            error = new MyErrorClass(error)

        throw error
    }

    return deferred;
}

这样,您只需附加一个错误处理程序,它将变异任何非
MyErrorClass
错误。一般来说,这似乎是一个奇怪的用例…

只需使用
映射失败案例,然后

actualPromise.then(null, function(error) {
    if (!(error instanceof MyErrorClass))
        error = new MyErrorClass(error)
    throw error;
})
.fail(function(err) {
    // err is now an instance of MyErrorClass and NOT a string
});

如果您需要包装器功能,请使用一个函数,该函数接受
actualPromise
并调用
,然后使用上面的代码调用

很漂亮,谢谢。我知道这是一个奇怪的用例,它是说服人们在现有代码基础上转向承诺的用例之一,同时支持当前回调汤所做的一些事情。好吧,一般来说,你不应该使用延迟。编写手动代码来提示回调API是对代码的巨大浪费。不幸的是,Q.nbind没有自动包装字符串错误,但您可以编写自己的实现。@Esailija--我只是想感谢您的评论,它澄清了我对承诺的理解。最初,我认为创建一个延迟的是创建新承诺的标准方式。我一直在玩q.js,现在事情变得简单多了。