2015-03-20 2 views
1

Я пытался уменьшить свои объекты обещания в своем сервисе. У меня есть что-то вродеКак разрешить мои обещания в моем случае

angular.module('myApp').service('testService', ['Employees','$q', 
    function(Employees, $q) { 
     var service = {}; 
     var firstEmp; 

     var deferred = $q.defer(); 

     Employees.query({ 
      Id: 123 
      }, function(objects) { 
       firstEmp = objects[0]; 
       deferred.resolve(objects); 
     }) 


     service.getFirstEmployee = function() { 
      var deferredtwo = $q.defer(); 

      // return deferredtwo.promise; 
      //How to solve the double promise defer in my case 
      //First promise is wait for the whole employees 
      //this one is to return first employee 
      deferred.promise.then(function(){ 
       deferredtwo.resolve(firstEmp); 
      }) 
      return deferredtwo.promise; 
     } 

     return service; 
]); 

контроллера

testService.getFirstEmployee.then(function(firstEmployee){ 
    console.log(firstEmployee) <---show first employee 
}) 

Я не знаю, как разрешить объекты двойного обещания. Может кто-нибудь мне помочь? Большое спасибо!

+0

В чем проблема с решением, которое у вас есть? –

+0

Я думаю, что вам следует использовать методы, которые получают всех сотрудников, а другой, которые получают сотрудника по id. Имея два метода, вы можете проверить, загружены ли все сотрудники и получить первый, иначе служба запроса будет только для первой. – Raulucco

+0

@FelixKling Создает два объекта defer, и я чувствую, что могу избавиться от него, но не знаю, как – BonJon

ответ

1

Если ваша конечная цель состоит в том, чтобы просто получить первый работник, то вам не нужно все это «двойное обещание» вещи вообще. Просто решить одно обещание с первым работником:

angular.module('myApp').service('testService', ['Employees','$q', 
    function(Employees, $q) { 

     var pFirstEmployee = $q(function (resolve) { 
      Employees.query({ Id: 123 }, function(objects) { 
       resolve(objects[0]); 
      }); 
     }); 

     return { 
      getFirstEmployee: function() { 
       return pFirstEmployee; 
      } 
     }; 
    } 
]); 

Если вы хотите два метода - один, который возвращает обещание для всех сотрудников вернулся из запроса, а другой, который возвращает только первое из этого набора, просто создать обещание для всех сотрудников и связать это:

angular.module('myApp').service('testService', ['Employees','$q', 
    function(Employees, $q) { 

     var pAllEmployees = $q(function (resolve) { 
      Employees.query({ Id: 123 }, resolve); 
     }), 
      pFirstEmployee = pAllEmployees.then(function (employees) { 
      return employees[0]; 
     }); 

     return { 
      getAllEmployees: function() { 
       return pAllEmployees; 
      }, 
      getFirstEmployee: function() { 
       return pFirstEmployee; 
      } 
     }; 
    } 
]); 
+0

То, что мне нужно! Спасибо! – BonJon

1

После уточнения я думаю, это то, что вы хотите:

angular.module('myApp').service('testService', ['Employees','$q', 
    function(Employees, $q) { 
     var service = {}; 
     var deferred = $q.defer(); 

     Employees.query({Id: 123}, function(objects) { 
      firstEmp = objects[0]; 
      deferred.resolve(objects); 
     }); 

     service.getFirstEmployee = function() { 
      return deferred.promise.then(function(employees){ 
       return employees[0]; 
      }); 
     } 

     return service; 
]); 
+0

Очень полезно спасибо! +1 – BonJon

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