2017-03-17 83 views
0

有沒有辦法爲承諾提供默認的errorCallback,例如,如果用戶提供了errorCallback,則默認的errorCallback會調用而不是是否有可能爲承諾提供默認的errorCallback?

function getFoo() { 
    // TODO magic goes here to setup defaultErrorCallback as default 
    return $http.get("/not_exists"); 
}; 

function defaultErrorCallback() { console.log("DDD"); } 
function customCallback() { console.log("CCC"); } 

getFoo().then(fooSuccess); 
// output: DDD 

getFoo().then(fooSuccess, customCallback); 
// output: CCC 
+0

爲什麼要這樣?通常情況下,你只需在你的承諾鏈的末尾添加'.catch(finalErrorCallback)',但看起來你想在'getFoo()'中添加處理程序(我認爲這是不可能的)。 – gyre

+0

這有點像問,有沒有辦法讓我的代碼捕獲它自己的錯誤,但只有當沒有人把它放入try-catch?這似乎不是一個非常明智的設計。 – JLRishe

+0

@gyre - 爲什麼?主要是因爲我有大量的代碼庫,有很多調用這個getFoo,不想重複getFoo()。然後(fooSuccess,defaultErrorCallback);.我們的defaultErrorCallback需要注入alertService,這對於這個樣板代碼來說也是非常煩人的。 –

回答

0

試試這個

function getFoo() { 
    // TODO your $q magic goes here. 
    return $http.get("/foo"); 
}; 

var res = getFoo(); 
res.success(function(result, status) {  
    console.log('succes : getFoo()'); 

}). 
error(function(data, status) { 
    console.log('failed calling service: method : getFoo()'); 
     // here you call your default function 
}); 
1

我不相信有一種方法來爲個人承諾做到這一點,但它可能override Angular's default error handling其作爲Angular1.6應該只處理那些錯誤沒有抓到其他地方:

angular. 
    module('exceptionOverwrite', []). 
    factory('$exceptionHandler', ['alertService', function(alertService) { 
    return function myExceptionHandler(exception, cause) { 
     alertService.alertError(exception, cause); 
    }; 
    }]); 

如果你想添加處理,以專門從getFoo()處理錯誤,你可以有getFoo()注入一些資料,請離子進入錯誤,使其識別:

function getFoo() { 
    return $http.get("/not_exists") 
     .catch(function (error) { 
      error.errorSource = 'getFoo'; 
      throw error; 
     }); 
} 

// elsewhere... 
angular. 
    module('exceptionOverwrite', []). 
    factory('$exceptionHandler', ['alertService', function(alertService) { 
    return function myExceptionHandler(exception, cause) { 
     if(exception.errorSource = 'getFoo') { 
     alertService.alertError(exception, cause); 
     } else { 
     // default error handling 
     } 
    }; 
    }]); 
1

還有就是這東西HTML 5.1的 "uncaught promise rejection" mechanism,這對於分派在當時沒有處理程序拒絕承諾的「uncaughtrejection」活動的承諾被拒絕。您添加事件偵聽器,獲取通知,處理拒絕並取消事件。您還可以監視「拒絕處理」事件以獲取更多信息。事實上,您將實施您自己的HostPromiseRejectionTracker,如ES7標準的第25.4.1.9節(pdf的第521頁)所述,它可能會非常複雜,很快。

有沒有像這樣在無極實現這需要用戶代碼添加特定處理程序承諾排斥是,無論是作爲.then第二參數或.catch第一參數(這對於then方法較好語法反正)。有很多方法可以做到這一點明確但你不能提供一個默認拒絕處理程序暗含如果用戶不提供一個。

說到「uncaughtrejection」事件並未在瀏覽器中廣泛實施,規範可能會在廣泛採用之前進行修改。

0

嘗試創建圍繞包裝這樣的 -

記住承諾是可鏈接的對象

function defaultCallback(){} 
function okCallBack(){} 
function getFoo(successCallback) { 
    // TODO your $q magic goes here. 
    var firstPromise = $http.get("/foo"); 
    var defaulErrorCallback=defaultCallback; 
     if (typeof successCallback == 'function') { 
      return firstPromise.then(successCallback).catch(defaulErrorCallback); 

     }else{ 
     return firstPromise; 
     } 
    }; 
getFoo(okCallBack); 
相關問題