2014-12-14 2 views
2

я хочу сделать следующее, у меня есть контроллер, как это:AngularJS ждет, пока все асинхронные вызовы будут завершены, даже если статус 401 будет возвращен?

dashboardService.getDashboardStateLakes().then(function (result) { 
      if (result) { 
       dosomething(); 
     }, function (err) { 
      //TODO: handle error; 
      //alert(err); 
      throw new Error(err); 
     }); 

     // populate dashboard lakes status (left upper of the screen) 
     dashboardService.getDashboardLakesStatus().then(function (result) { 
      if (result) { 
       dosomething(); 
      } 
     }, function (err) { 
      //alert(err); 
      //throw new Error(err); 
     }); 

и в обслуживании он делает так:

this.getDashboardLakesStatus = function() { 
     var deffered = $q.defer(); 
     $http.get(api.GET_dashboardLakesStatus) 
      .success(function (result) { 
       //logic 
       deffered.resolve(result); 
      }) 
      .error(function (data, status) { 
       //logic 
       deffered.reject(status); 
     return deffered.promise; 
    }; 

Теперь все, что я хочу сделать что-то, когда оба ajax-вызовы завершены, но проблема в том, что иногда 401 возвращается (намеренно), а $ q останавливается, когда возникает ошибка ... какой у меня другой вариант?

+0

Я не понимаю, что вы хотите. Вы хотите сделать некоторую логику после завершения 2 $ http.get независимо от того, успешны ли они? Или только если они преуспеют или что? –

+0

независимо от того, успешны они или нет, это правильно – totothegreat

+0

Все еще не совсем уверен в проблеме. Почему вы не помещаете свою логику (dosomething()) в обработчики ошибок? –

ответ

3

Обработка исключений Promise аналогична попытке/уловке в синхронном коде. Вы можете сделать обещание решительность, восстанавливая его от плохого состояния:

$http.get(api.GET_dashboardLakesStatus).catch(function(e){ });// always resolved 

Примите к сведению, что в результате этого получите вызов будет либо фактический ответ или undefined, если произошла ошибка. Это позволит вам вызывать несколько из этих вызовов, даже если некоторые из них не работают.

Также обратите внимание, что у вас есть deferred anti pattern. Вам не нужно создавать отложенные при работе с API, который уже возвращает обещания. Рассмотрите возможность использования .then и .catch в пользу .success и .error, пока вы на нем.

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