2014-10-15 2 views
0

У меня есть угловое приложение, но иногда мои обратные вызовы, похоже, выполняются до их использования. Я определил сервис для своих вызовов api, его методы выглядят так.Угловой обратный вызов после вызова API

function addOffer(id) { 
     var request = $http({ 
      method: "get", 
      url: "/api/campaign/offers", 
      params: { 
       action: "add", 
       id: id 
      } 
     }); 
     return (request.then(handleSuccess, handleError)); 
    } 
    function handleError(response) { 

     // The API response from the server should be returned in a 
     // nomralized format. However, if the request was not handled by the 
     // server (or what not handles properly - ex. server error), then we 
     // may have to normalize it on our end, as best we can. 
     if (
      !angular.isObject(response.data) || !response.data.message 
     ) { 

      return ($q.reject("An unknown error occurred.")); 

     } 

     // Otherwise, use expected error message. 
     return ($q.reject(response.data.message)); 

    } 

    function handleSuccess(response) { 
     return (response.data); 

    } 

А потом в мой контроллер у меня есть область применения функции, определенные как этот

$scope.addOffer = function(){ 
    campaignService.addOffer($scope.id).then(
     loadRemoteData() 
    ); 
}; 

Удаленная функция загрузки данных синхронизирует клиент с тем, что хранится в интерфейсе приложения.

Моя проблема заключается в том, что в методе addOffer контроллера функция loadRemoteData() запускается перед добавлением предложения, так что она загружает данные без нового предложения. Но затем при вынужденном обновлении это предложение есть. Есть ли что-то, что нужно сделать по-другому, чтобы это работало так, как ожидалось?

+0

После хорошего количества исследований в '$ q' и' $ http' реализация обещания, я упал на моих основах JavaScript и ответил на ваш вопрос. Это снова повторяет, почему основы должны быть очень сильными. –

ответ

2

Проблема с () в loadRemoteData(). Независимо от того, где вы это делаете, функция loadRemoteData() будет фактически выполнена. Если вы просто хотите передать loadRemoteData функцию в качестве успешного обратного вызова на .then(), тогда вы должны просто передать имя функции.

Изменить код контроллера для:

$scope.addOffer = function(){ 
    campaignService.addOffer($scope.id).then(loadRemoteData); 
}; 
+1

Это работало, разочаровывая, что это была такая простая концепция JS. Думаю, мне нужно освежить мои основы JS. – jankyd

+0

Иногда нам не хватает таких сложных деталей. Я делаю это много раз. Но, как вы говорите, основы - это все, что вам нужно. –

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