30

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

3 Answers 3

39

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);
});
Sign up to request clarification or add additional context in comments.

7 Comments

Also you can check for statusText value which would to be "unknown" github.com/angular/angular.js/blob/v1.2.23/src/ng/… eg. if (reject.status === 0 && reject.statusText === 'unknown') { ... Should be careful thought, it's undocumented.
Actually "unknown" is present only for jsonp.
In 1.4.8 whether I resolve or reject the promise, the XHR is aborted. The problem though is that I can't pass any data to the rejection method, like my interceptor.
when i deferred.reject('timeout') from my function, I dont get timeout as response in my controller. Its always undefined. any idea why this happens?? I use deferred.reject(); in my $timeout
@JayeshJain can you make a plnkr ?
|
2

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.

Comments

0

I was working on a embedded system and i was having hang outs from time to time since its a physical device so it stays turned on for days/months/years using $timeout fixed this behavior

Quick Example (timeout wrapper for http promises)

Module

var myApp = angular.module('myApp',['ngRoute']);

Service

var yourServiceModule = myApp.service('YourService', function ($http) {
    this.your_method = function (a) { return a*a};
});

Controller

//just wrap your service,http call using $timeout
$timeout(function() {
    //vanilla service call
    YourService.your_method().then(
              function (response) {
                 //console.log("sync_with_cloud: "+ response);
                 $scope.check_cloud_port_statuses_progress=100;
                 //...
             },
              function(data) {
                  // Handle error here

                $rootScope.global_config_1 += "\nError(333): cant connect to cloud at "+Date.now();+"\n\n";
                $scope.check_cloud_port_statuses_progress = -1;
              }
    );

}, 8);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.