2015-04-03 5 views
0

У меня есть метод контроллера, который я называю методы обслуживания в Угловом зовют сервера из строя:.Почему угловой вызов сервера не работает?

контроллер:

$scope.add = function() { 
     var waiver = new MyObject(); 
     service.add(waiver); 
     service.getLast().then(function (result) { 
      $scope.model.myObjects.push(result.data); 
     }); 
    } 

Услуга:

this.add = function (waiver) { 
     $http({ 
      method: "POST", 
      url: "api/theServer/Add/", 
      data: waiver 
     }); 
    }; 



    this.getLast = function() { 
     return $http({ 
      method: "GET", 
      url: "api/TheServer/GetLast" 
     }) 
     .success(function (data) { 
      return data; 
     }) 
     .error(function (data) { 
      console.log(data); 
      alert("EPIC FAIL"); 
     }) 
     ; 
    }; 

Если я использую Chromes отладки инструменты, угловые вызовы методов SERVICE в правильном порядке; однако, когда фактический сервер называется GetLast вызывается перед добавлением. Мне нужно, чтобы они вызывались по порядку на сервере.

Любые предложения?

+0

'$ http' асинхронный, но не дожидаясь первого вызова разрешить перед вызовом второй метод, поэтому нет гарантированного заказа. – Claies

ответ

2

Вы вызываете эти асинхронно, чтобы не было гарантии заказа. Если вам нужно, чтобы гарантировать, что один вызов происходит раньше другого, то вам необходимо приковать звонки:

service.add(waiver) 
    .then(function(){ 
     return service.getLast(); 
    }) 
    .then(function (result) { 
     $scope.model.myObjects.push(result.data); 
    }); 
+0

Могу ли я вызвать метод, который ничего не возвращает? (добавить) – Robert

+0

Нет, вам нужно заставить его вернуть обещание. –

+0

Кроме того, вы можете использовать '.bind' для удаления одного обратного вызова:' service.add (waiver) .then (service.getLast.bind (service)). Then (function (result) {/ * do stuff * /}) ; ' –

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