簡體   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