繁体   English   中英

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

[英]Promise - wrapping error during deferred.reject

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

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的字符串。

上面的代码可以工作,但并不是很理想-我知道我不应该被延缓猴子补丁。 但是有更好的方法吗?

这是更漂亮/更像这样的承诺:

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错误。 总的来说,这似乎是一个奇怪的用例...

只需在与故障情况下映射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使用上面的代码进行调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM