2016-04-08 80 views
0

我從工廠調用getBookID並通過使用從同一工廠調用getBookInfo的結果。但在Console.log(bookInfo)中,它顯示了以前調用的結果! 如何在返回前更新deferred.promise值?更新q在返回前推遲承諾

這是我的控制器

​​

,這是我廠

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

您應該在每種方法中返回一個新的承諾。 –

回答

0

你應該返回一個新的承諾,爲您的每個服務方法:

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; 
}]); 

承諾不應該被重複使用(除非您要執行任務的倍數觸發同樣的決心/拒絕......不過,你應該明確地實現一個promise集合器,我認爲)。

0

所有角度的服務是單身,所以我想你得到這個錯誤是getBookIDsgetBookList份額的原因相同deferred

嘗試將您的工廠更改爲

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; 
}]);