2016-04-08 10 views
0

私は工場からgetBookIDsを呼び出し、その結果を使って同じファクトリからgetBookInfoを呼び出します。しかし、Console.log(bookInfo)には前の呼び出しの結果が表示されます! 返す前にdeferred.promise値を更新するにはどうすればよいですか?update q返す前に約束を延期する

これは私のコントローラ

​​

であり、これはすべての角度のサービスはシングルトンなので、私はあなたがこのバグを得た理由はgetBookIDsgetBookList同じdeferredを共有していると思います私の工場

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

約束は、あなたは、まだ...(再利用すべきではありませんそのための約束を明示的に実装する必要があります)。

0

です

に工場を変更してください。
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; 
}]); 
関連する問題