На моей фабрике AjaxPromiseService.js
я пытался включить механизм тайм-аута в вызовы с обещаниями (обычно $ http.get/post звонки в удаленные службы). То, как я сейчас делаю, - это создать гонку между событием $timeout
и действительными обещаниями. Пример кода следующим образом (код из моего AjaxPromiseService.js
завода в AngularJS): 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()' возвращает обещание ... Я не уверен, что вы просите иначе - обещание чего? –
, поэтому вам не нужно обертывать $ q.defer() в $ http(), чтобы вернуть обещание? – TonyGW