2016-04-08 12 views
0

Ich rufe getBookIDs von der Fabrik und mit Hilfe des Ergebnisses rufe ich getBookInfo aus der gleichen Fabrik. aber in der Console.log (bookInfo) zeigt es mir das Ergebnis des vorherigen Aufrufs! Wie kann ich den deferred.promise-Wert vor der Rückgabe aktualisieren?update q Verzögerung Versprechen vor der Rückkehr

das ist mein Controller

angular.module('myApp.products',[]) 
    .controller('productController', function ($scope , MainFactory , $location) { 
     function getBookInfo(bookIDs){ 
      MainFactory.getBookList(bookIDs) 
       .then(function (bookInfo) { 
        console.log(bookInfo) 
       }) 
     } 

     MainFactory.getBookIDs() 
      .then(function (result) { 
       $scope.bookIDList = result; 
       getBookInfo($scope.bookIDList); 
      }); 


    }); 

und dies ist mein Werk

app = angular.module('myApp'); 

app.factory("MainFactory", ['$soap', '$http', '$q', function ($soap, $http, $q) { 
    var viewFactory = {}; 
    var deferred = $q.defer(); 
    viewFactory.getBookIDs = function() { 
     //var bookIDs = []; 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooks', 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      console.log('error', error); 
     }); 
     return deferred.promise; 
    }; 

    viewFactory.getBookList = function (bookIDs) { 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooksInfo&p1=' + bookIDs, 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      deferred.reject(error); 
     }); 
     return deferred.promise; 
    }; 

    return viewFactory; 
}]); 
+0

Sie sollten ein neues Versprechen bei jeder dieser Methoden zurückgeben. –

Antwort

0

Sie sollten eine neue Versprechen für jeden Ihrer Service-Methoden zurück:

app.factory("MainFactory", ['$soap', '$http', '$q', function ($soap, $http, $q) { 
    var viewFactory = {}; 
    viewFactory.getBookIDs = function() { 
     var deferred = $q.defer(); 
     //var bookIDs = []; 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooks', 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      console.log('error', error); 
     }); 
     return deferred.promise; 
    }; 

    viewFactory.getBookList = function (bookIDs) { 
     var deferred = $q.defer(); 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooksInfo&p1=' + bookIDs, 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      deferred.reject(error); 
     }); 
     return deferred.promise; 
    }; 

    return viewFactory; 
}]); 

Versprechen nicht wiederverwendet werden sollte (es sei denn, Sie wollen die gleiche Entschlossenheit Multiples Aufgaben Auslösung/ablehnen ... nach wie vor, Sie sollte (glaube ich) explizit einen Promise Aggregator implementieren.

0

Alle Winkeldienste sind Singletons, so dass ich denke, der Grund, Sie diese Wanze ist getBookIDs und getBookList die gleiche deferred

versuchen Sie Ihre Fabrik zu

ändern
app.factory("MainFactory", ['$soap', '$http', '$q', function ($soap, $http, $q) { 
    var viewFactory = {}; 
    viewFactory.getBookIDs = function() { 
     //var bookIDs = []; 
     var deferred = $q.defer(); 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooks', 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      console.log('error', error); 
     }); 
     return deferred.promise; 
    }; 

    viewFactory.getBookList = function (bookIDs) { 
     var deferred = $q.defer(); 
     $http({ 
      url: 'http://127.0.0.1/client.php?fn=getBooksInfo&p1=' + bookIDs, 
      method: "GET" 
     }).then(function success(response) { 
      deferred.resolve(response.data.result); 
     }, function myError(error) { 
      deferred.reject(error); 
     }); 
     return deferred.promise; 
    }; 

    return viewFactory; 
}]); 
Verwandte Themen