2015-08-27 3 views
0

Привет Я хочу отменить свой HTTP-запрос после 2 секунд. Если данные не были получены, он должен разрешить функцию ошибки и вернуть пустой объект.Отмена функции запроса HTTP и разрешения ошибки в угловом

Я знаю, что мне почему-то нужно использовать свойство тайм-аута. Где я могу использовать $ timeout точно? Я не уверен, правильно ли я это понял.

app 
    .service('testService',['$http','$q','$timeout', 
    function($http,$q,$timeout){ 

     var canceler=$q.defer(); 

     this.options = function (long,lat) { 


     return $http({ 
      method: 'POST', 
      url: '/coordinates', 
      headers: { 
      'Content-Type' : 'application/json; charset=utf-8', 
      'Data-Type': 'json' 
      }, 
      data: { 
      "long":long, 
      "lat": lat 
      }, 
      timeout:canceler.promise 

     }).then(function (response) { 
      return response.data; 
     },function(error){ 
      return {}; 
     }); 
     }; 
    }]); 

ответ

1

Использование reject в вашем $ таймаут, как

$timeout(function(){ 
    return canceler.reject(reason); 
},2000); 

Итак, вы $http запрос выглядит следующим образом:

var timeoutCase = function(){ 
    $timeout(function(){ 
     return canceler.reject(reason); 
    },2000); 
} 

var apiCall = function(){ 

    // call timeout function 
    timeoutCase(); 

    // http call 
    return $http({ 
     method: 'POST', 
     url: '/coordinates', 
     headers: { 
     'Content-Type' : 'application/json; charset=utf-8', 
     'Data-Type': 'json' 
     }, 
     data: { 
     "long":long, 
     "lat": lat 
     }, 
     timeout:canceler.promise 

    }).then(function (response) { 
$timeout.cancel(timeoutCase); 
     return response.data; 
    },function(error){ 
     return {}; 
    }); 
} 

// call Http function. 
api().then(function(response){ 
    console.log(response); 
}) 
+0

большой ... работает нормально. Dunno, почему я не мог понять, что мы сами ... большая помощь – Dribel

1

Вы можете передать объект конфигурации метода, что ваш используете (В вашем сценарии POST):

post(url, data, [config]); 

В объекте конфигурации можно указать свойство тайм-аут:

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

Так пример для POST вызова метода будет:

$http.post('www.host.com/api/resource', {payload}, {timeout:2000}) 
      .then(function(){ //success }); 
      .catch(function(){ return {};}); 

return {}; ли просто имитировать пустой объект, который вы упоминаете.

На угловом участке документации есть некоторые хорошие примеры использования $http службы

С другой стороны, $timeout является оберткой угловом для window.setTimeout здесь ссылка на documentation.

Таким образом, вы можете использовать $ timeout, чтобы инициировать решение обещания об отмене, или просто позволить свойству тайм-аута выполнять свою работу при выполнении запроса. Это будет зависеть от вашего требования. Но моя рекомендация - использовать свойство тайм-аута для запроса, который вы делаете. Нет необходимости отменить запрос внешним таймером.

0

Чтобы достичь этого, вы можете использовать $ timeout. Вы отменяете HTTP-запрос или обещание тайм-аута, согласно которому каждый заканчивается первым. Если тайм-аут происходит, сначала вы отменяете HTTP-запрос, если до истечения срока ожидания HTTP-ответа разрешается отменить таймаут. Вот пример:

var httpPromise = $http({ 
      method: 'POST', 
      url: '/coordinates', 
      headers: { 
      'Content-Type' : 'application/json; charset=utf-8', 
      'Data-Type': 'json' 
      }, 
      data: { 
      "long":long, 
      "lat": lat 
      } 
     }); 

var timeoutPromise = $timeout(function() { 
     httpPromise.reject("Timeout occurred"); // timeout occurred first, reject httpPromise. 
}, 2000); 

return httpPromise.then(function(data){ 
    $timeout.cancel(timeoutPromise); //http request resolved before timeout occurred, cancel the timeout. 
    return data; 
}); 
Смежные вопросы