在我的AjaxPromiseService.js
工廠中,我一直試圖將超時機制納入承諾調用(通常爲$ http.get/post調用遠程服務)。我目前的做法是在$timeout
事件和實際承諾呼叫之間建立一個競賽。示例代碼如下(以AngularJS代碼從我AjaxPromiseService.js
廠):also available in this plnkrAngularJS:超時承諾電話
var timeoutObj = {"isTimeout": true};
function timeoutPromise(deferredObj) {
$timeout(function() {
console.log("promise timeout");
deferredObj.resolve(timeoutObj);
}, timeoutLimit); // timeoutLimit is in milisecond
}
//promise calls (e.g. $http.get())
function getDummyData(milisec) {
var data = {"data" : "dummy data from ajax!"};
var deferred = $q.defer();
timeoutPromise(deferred); //start the race to see who resolves first
//use $timeout to mimick an AJAX call
$timeout(function() {
deferred.resolve(data);
$timeout.cancel(timeoutPromise(deferred)); //not working, how to cancel the race here?
}, milisec); //
return deferred.promise;
} //getDummyData
這似乎工作,如果getDummyData()
未在規定的時間內解決,timeoutPromise()
將返回有用的標誌,所以我可以讓AJAX調用優雅地失敗。 timeoutPromise()
和getDummyData()
將最終按順序排序,但是,我想取消timeoutPromise()
如果getDummyData()
首先被解決。我想知道如何做到這一點?
我需要返回prommise,而不是解決數據。謝謝 – TonyGW
'return $ http()。then()'返回一個承諾...我不確定你在問什麼 - 否則 - 承諾什麼? –
因此,您不需要在$ http()中包裝$ q.defer()來返回承諾? – TonyGW