29er 29er - 1 year ago 200
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 Source

This code is from $httpBackend source code:

if (timeout > 0) {
  var timeoutId = $browserDefer(timeoutRequest, timeout);
} else if (timeout && timeout.then) {

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 })
      // success handler
      // error handler            
      if(reject.status === 0) {
         // $http timeout
      } else {
         // response error status from server 

  $timeout(function() {
    deferred.resolve(); // this aborts the request!
  }, 1000);
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download