[英]AngularJS: timeout promise calls
在我的AjaxPromiseService.js
工廠中,我一直試圖將超時機制合並到promise調用中(通常是對遠程服務的$ http.get / post調用)。 我當前正在做的方式是在$timeout
事件和實際的promise調用之間創建競賽。 如下示例代碼(來自我在AngularJS中的AjaxPromiseService.js
工廠的代碼): 在此plnkr中也可用
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()
都將按順序最終解決,但是,如果getDummyData()
撤銷 timeoutPromise()
,我想取消 timeoutPromise()
。 我想知道如何做到這一點?
$http
有一個timeout
參數,當一個promise被解決時,它將使請求timeout
-因此,您可以給它一個$timeout
:
getData: function(input, timeout){
var timeoutPromise = timeout ? $timeout(function(){}, timeout) : null;
return $http({url: "/some/url",
timeout: timeoutPromise,
method: "GET"
}).then(function(response){
var data = response.data;
// do something with data, if needed
return data;
});
}
如果您使用的是$ http,則有一個更簡單的選項。 使用$ http配置對象的timeout屬性和$ timeout服務:
var requestTimeout = $timeout(function() {}, 4000);
$http({ method:'GET', url:'...', timeout: requestTimeout});
requestTimeout.then(function() {
console.log ('request aborted - timed out!');
});
如果請求在超時時間內成功,則$ timeout將自動中止。
根據$ http文檔 , $ http配置的timeout
屬性接受一個諾言,或者一個毫秒數 :
timeout
–{number|Promise}
– 超時(以毫秒為單位),或承諾應在解決后中止請求。
因此,解決方案很簡單:
function getData () {
return $http.get(someUrl, {timeout: 3000}); // adjust the value to what you need
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.