app.factory('documentListFactory',['$http','$q',function($http,$q){
//申明一个延迟
var deferred = $q.defer();
$http.get('http://3.cs/index.php?_json=1&_content=1').success(function(response){
deferred.resolve(response);
}).error(function(response){
deferred.reject(response);
});
// 返回承诺,这里并不是最终数据,而是访问最终数据的API
return deferred.promise;
}]);
app.factory('documentTagsFactory',['$http','$q',function($http,$q){
//申明一个延迟
return {
query(ids)
{
var deferred = $q.defer();
$http.post('http://3.cs/index.php/tags/assoc-tags',{
'id':ids ? ids : [1,23],
'model':'Document'
}).success(function(response){
deferred.resolve(response);
}).error(function(response){
deferred.reject(response);
});
return deferred.promise;
}
}
}]);
app.controller('listController',['$scope','$http','$q','documentListFactory','documentTagsFactory',function($scope,$http,$q,documentListFactory,documentTagsFactory){
var documentList = {};
/*
code.....
*/
//var promise = $q.all([documentListFactory,documentTagsFactory.query(documentListFactory)]);
promise.then(function(data){
//console.log(data);
//console.log(documentList);
//console.log(3);
});
}]);
如上程式碼,有兩個Facotry我都是用deferred延遲,使用promise來進行類似於同步加載的,
但現在有個問題
我documentTagsFactory裡面的方法query(ids)是需要一個參數進行傳遞的,而這個參數依賴documentListFactory的結果,
angularjs新手,這裡我卻不知道怎麼實現了,使用$q.all確實實現的多個同步,但是卻還是沒辦法傳遞參數,不知大家有什麼方法,
PS:本人非常不喜歡類似jquery裡面的
$.get(function(){
$.get(function(){
})
})
或
promise.then(function(){
promise2.then(function(){
})
})
這種巢狀。
要的是類似同步,並且非嵌套的方法,謝謝
过去多啦不再A梦2017-05-15 17:01:02
http://stackoverflow.com/questions/24402911/abort-angularjs-http-request-deeply-nested-in-multiple-service-calls
大家讲道理2017-05-15 17:01:02
app.factory('documentListFactory',['$http','$q',function($http,$q){
//申明一个延迟
var deferred = $q.defer();
$http.get('http://3.cs/index.php?_json=1&_content=1').success(function(response){
deferred.resolve(response);
}).error(function(response){
deferred.reject(response);
});
// 返回承诺,这里并不是最终数据,而是访问最终数据的API
return deferred.promise;
}]);
直接這樣寫不就完了
app.factory('documentListFactory',['$http',function($http){
return $http.get('http://3.cs/index.php?_json=1&_content=1');
}]);
app.factory('documentTagsFactory', ['$http', function ($http) {
return {
query: function (ids) {
return $http.post('http://3.cs/index.php/tags/assoc-tags', {
'id': ids ? ids : [1, 23],
'model': 'Document'
});
}
}
}]);
documentListFactory
.success(function (ids) {
return documentTagsFactory.query(ids);
})
.success(function (data) {
//todo
});
淡淡烟草味2017-05-15 17:01:02
使用 $q.when
方法
(function () {
var app = angular.module("myApp", []);
app.service('noPromise', function() {
return {
getResult: function() {
return { status: "noPromise" };
}
};
});
app.service("promise", ['$q', '$timeout', function($q, $timeout) {
return {
getResult: function() {
var deferral = $q.defer();
$timeout(function() {
deferral.resolve( { status: "promise" } );
}, 1000);
return deferral.promise;
}
};
}]);
app.run(['$rootScope', '$q', 'noPromise', 'promise',
function ($rootScope, $q, noPromise, promise) {
$rootScope.status = 'Ready.';
$q.when(noPromise.getResult()).then(function(result) {
$rootScope.status = result.status;
});
$q.when(promise.getResult()).then(function(result) {
$rootScope.status = result.status;
});
}]);
})();
http://jsfiddle.net/hjzheng/nd1wfkj3/