0

我正在尝试创建一个延迟包装器q.js,这样我就可以在自定义错误类中包装错误(字符串),然后再通过then()or中的承诺传回它们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')

并期望进入MyErrorClass处理fail()程序,而不是传递给deferred.reject.

上面的代码有效,但并不理想——我知道我不应该对 deferred.reject 进行猴子修补。但是有没有更好的方法来做到这一点?

4

2 回答 2

1

它更漂亮/更面向承诺,如下所示:

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错误。不过,这似乎是一个奇怪的用例……

于 2013-11-14T23:50:36.217 回答
0

只需使用以下命令映射失败案例then

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并调用then上面的代码。

于 2013-11-14T23:54:01.330 回答