Подтвердить что ты не робот

Angular $http: установка обещания в настройке 'timeout'

В Angular $http docs в нем упоминается, что вы можете установить конфигурацию "timeout" либо в номер, либо в обещание.

timeout - {number | Promise} - тайм-аут в миллисекундах или обещание должен прервать запрос при его разрешении.

Но я не уверен, как сделать эту работу, используя обещание. как мне установить число и обещание? В принципе, я хочу знать, вызвана ли ошибка HTTP (обещание) из-за "тайм-аута" или чего-то еще. Мне нужно понять разницу. Спасибо за любую помощь!!!

4b9b3361

Ответ 1

Этот код из $httpBackend исходный код:

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) означает, что когда обещание разрешено (не отклонено), вызывается timeoutRequest и запрос xhr прерывается.


Если запрос был тайм-аутом, тогда reject.status === 0 (Примечание: в случае сбоя сети, тогда reject.status также будет равно 0), Пример:

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

Ответ 3

Я работал над встроенной системой, и время от времени у меня зависало время от ее физического устройства, поэтому он включается в течение дней/месяцев/лет, используя $timeout, фиксированное это поведение

Быстрый пример (оболочка тайм-аута для http promises)

Модуль

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

Сервис

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

контроллер

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