Angular $http: установка обещания в настройке 'timeout'
В Angular $http
docs в нем упоминается, что вы можете установить конфигурацию "timeout" либо в номер, либо в обещание.
timeout - {number | Promise} - тайм-аут в миллисекундах или обещание должен прервать запрос при его разрешении.
Но я не уверен, как сделать эту работу, используя обещание. как мне установить число и обещание?
В принципе, я хочу знать, вызвана ли ошибка HTTP (обещание) из-за "тайм-аута" или чего-то еще. Мне нужно понять разницу.
Спасибо за любую помощь!!!
Ответы
Ответ 1
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);
});
Ответ 2
У меня был подобный вопрос, вы можете проверить эту ссылку: Angular 1,5 тайм-аута с использованием HttpInterceptor о том, как реализовать тайм-аут в httpInterceptor. jsFiddle включен в anwser. Для получения ответа на все кредиты выйдите https://stackoverflow.com/users/3959997/mita.
Ответ 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);