Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular $http : setting a promise on the 'timeout' config

In the Angular $http docs, it mentions that you can set the 'timeout' config to either a number or a promise.

timeout – {number|Promise} – timeout in milliseconds, or promise that should abort the request when resolved.

But I am not sure how to make this work using a promise. how do i set a number and a promise ? Basically I want to be able to know whether an http call (promise) errored due to a 'timeout' or something else. I need to be able to tell the difference. Thanks for any help !!!

like image 381
29er Avatar asked Feb 20 '14 17:02

29er


2 Answers

This code is from $httpBackend source code:

if (timeout > 0) {   var timeoutId = $browserDefer(timeoutRequest, timeout); } else if (timeout && timeout.then) {   timeout.then(timeoutRequest); }  function timeoutRequest() {   status = ABORTED;   jsonpDone && jsonpDone();   xhr && xhr.abort(); } 

timeout.then(timeoutRequest) means that when the promise is resolved (not rejected) timeoutRequest is invoked and xhr request is aborted.


If the request was timeout then reject.status === 0 (Note: in case of a network failure, then reject.status will also be equals to 0), An example:

app.run(function($http, $q, $timeout){    var deferred = $q.defer();    $http.get('/path/to/api', { timeout: deferred.promise })     .then(function(){       // success handler     },function(reject){       // error handler                   if(reject.status === 0) {          // $http timeout       } else {          // response error status from server        }     });    $timeout(function() {     deferred.resolve(); // this aborts the request!   }, 1000); }); 
like image 57
Ilan Frumer Avatar answered Oct 02 '22 14:10

Ilan Frumer


I had a sort a like question, you can check this link: Angular 1.5 timeout using a HttpInterceptor on how implement the timeout in an httpInterceptor. jsFiddle is included in the anwser. All credit go out to https://stackoverflow.com/users/3959997/mita for the answer.

like image 39
Ben Croughs Avatar answered Oct 02 '22 12:10

Ben Croughs