2015-10-14 3 views
0

я получил совершенно рабочий сервисAngularJS таймаут HTTP

this.getcustomers= function() { 
         var deferred = $q.defer(); 
         $http({ 
          method: 'GET', 
          url: 'api/customers' 
         }).then(function success(data) { 
          deferred.resolve(data.data); 
          }, function error(error) { 
          deferred.reject(error); 
          }); 
         return deferred.promise; 
        }; 

Как я добавить timeout к вышесказанному. Я пробовал выборки из stackoverflow, но ничего не работает. Мне нужен запрос, чтобы продолжить попытку в течение 5000 мс и показать ошибку при прохождении этого времени. Добавление timeout : timeout|promise не работает со мной.

Любые идеи?

+0

Может быть, это один помогает http://stackoverflow.com/questions/15015416/how-to-set-a-global-http-timeout-in-angularjs – LGSon

+0

Да, я пробовал это, к сожалению, не решая вопроса. – user3052526

ответ

1

Что вы ищете - это механизм retry, а не timeout. Тайм-аут означает «выполнить действие после X-времени», в любом случае.

Смотрите ответ здесь, должно быть то, что вы ищете:
AngularJS service retry when promise is rejected

+0

Это действительно сработало, но как я могу продолжать попытки «X» количество секунд? – user3052526

+0

Ну, вместо проверки количества попыток, сравните время. Сохраните временную метку первой попытки. Вы можете использовать 'Date.now()', чтобы получить временную метку unix. Затем продолжайте повторную попытку, пока 'Date.now() - startTime' больше, чем вы хотите ограничить. – Artless

+0

Я тестировал этот подход, и он работал хорошо. спасибо – user3052526

0

Здесь работает связь jsfiddle

function httpRequestHandler() { 
      var timeout = $q.defer(), 
       result = $q.defer(), 
       timedOut = false, 
       httpRequest; 

      $timeout(function() { 
       timedOut = true; 
       timeout.resolve(); 
      }, (1000 * $scope.timeout)); 

      httpRequest = $http({ 
       method : 'post', 
       url: '/echo/json/', 
       data: createData(), 
       cache: false, 
       timeout: timeout.promise 
      }); 

      httpRequest.success(function(data, status, headers, config) { 
       result.resolve(data); 
      }); 

      httpRequest.error(function(data, status, headers, config) { 
       if (timedOut) { 
        result.reject({ 
         error: 'timeout', 
         message: 'Request took longer than ' + $scope.timeout + ' seconds.' 
       }); 
       } else { 
        result.reject(data); 
       } 
      }); 

      return result.promise; 
     } 
+0

Это был первый, который я нашел, я изменил его на '. then' вместо' .success' и '.error' и попытался реализовать его, но не работал – user3052526

+0

почему вы меняете .success и .error на. then ? –

+0

Рекомендуется как на '$ http' на документах AngularJS. Или я что-то пропустил? – user3052526

Смежные вопросы