承诺 - 在deferred.reject期间包装错误

时间:2013-11-14 23:41:57

标签: javascript node.js promise q

我正在尝试使用q.js创建一个延迟包装器,以便我可以在自定义错误类中将错误(字符串)包装起来,然后再由then()或{{中的承诺传回1}}。这就是我现在正在做的事情:

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。但是有更好的方法吗?

2 个答案:

答案 0 :(得分: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错误。虽然看起来像一个奇怪的用例......

答案 1 :(得分: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