29er 29er - 3 months ago 22
AngularJS Question

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

In the Angular

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 !!!

Answer

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);
});