async for each循环之后回调函数
如何在async for循环之后添加回调函数?async for each循环之后回调函数
下面是一些更好的方面:
$scope.getAlbums = function(user, callback) {
$scope.albumsList.forEach(function (obj, i) {
$scope.getAlbum(user, obj.id, function(value){
$scope.albums.push(value);
});
});
// callback(); ???
};
$scope.getAlbums('guy123', function(){
// forEach loop is all done!
console.log($scope.albums)
});
控制器:
.controller('Filters', ['$scope','Imgur', function($scope, Imgur) {
$scope.getAlbum = function(user, id, callback) {
Imgur.album.get({user:user, id:id},
function(value) {
return callback(value.data);
}
);
}
$scope.getAlbums = function(user, callback) {
// Callback function at end of this forEach loop?
// Request is async...
$scope.albumsList.forEach(function (obj, i) {
$scope.getAlbum(user, obj.id, function(value){
$scope.albums.push(value);
});
});
};
)]};
服务:
.factory('Imgur', function($resource) {
return {
album : $resource('https://api.imgur.com/3/account/:user/album/:id')
}
});
正如安德鲁所说的使用$q
和延期对象应该可以让你实现你的目标。
你想用$q.all()
这将确保所有承诺的对象都解决了,然后你可以用$http
电话拨打你的电话回.then()
function MyCtrl($scope, $q, $http) {
$scope.albumsList = [{
id: 1,
name: "11"
}, {
id: 2,
name: "22"
}
];
$scope.albums = [];
$scope.getAlbum = function(user, id, callback) {
return $http.get("https://api.imgur.com/3/account/" + user + "/album/" + id).success(
function(value) {
return callback(value.data);
}
);
}
$scope.getAlbums = function (user, callback) {
var prom = [];
$scope.albumsList.forEach(function (obj, i) {
prom.push($scope.getAlbum(user, obj.id, function(value){
$scope.albums.push(value);
}));
});
$q.all(prom).then(function() {
callback();
});
};
$scope.getAlbums('guy123', function() {
alert($scope.albums.length);
});
}
运作,但不
随着延期对象,你可以访问一个承诺,你可以改变连续then()
一起调用。当您解析延迟对象时,它将执行foreach,然后执行您提供的回调函数。我试图进一步简化你的例子,所以它可以在jsfiddle中工作。
function MyCtrl($scope, $http, $q) {
$scope.albumsList = [{
id: 1,
name: "11"
}, {
id: 2,
name: "22"
}];
$scope.albums = [];
$scope.getAlbums = function (user, callback) {
var deferred = $q.defer();
var promise = deferred.promise;
promise.then(function() {
$scope.albumsList.forEach(function (obj, i) {
$scope.albums.push(obj);
});
}).then(function() {
callback();
});
deferred.resolve();
};
$scope.getAlbums('guy123', function() {
alert($scope.albums.length);
});
}
我t看起来像推迟http://docs.angularjs.org/api/ng.$q,特别是链接承诺可能在这里很有用。
你能分享一个例子在上下文中与这个问题:)? – 2013-05-07 23:46:14
请看上面马克的回答。 – 2013-05-08 00:31:09
$scope.getAlbums = function(user, callback) {
var promiseArr = [];
$scope.albumsList.forEach(function (obj, i) {
var anHttpPromise =
$scope.getAlbum(user, obj.id, function(value){
$scope.albums.push(value);
});
promiseArr.push(anHttpPromise);
});
$q.all(promiseArr).then(function(){
// This callback function will be called when all the promises are resolved. (when all the albums are retrived)
})
};
$scope.getAlbum = function(user, id, callback) {
var anHttpPromise = Imgur.album.get({user:user, id:id},
function(value) {
return callback(value.data);
}
);
return anHttpPromise;
}
在上面的代码:
- 的
getAlbum
由返回一个承诺。 - 收集为
getAlbums
列表 - 的每个迭代的承诺,一旦所有的承诺都收集,许数组被传递给
$q.all
- 的
$q.all
方法,而不是返回一个最终的承诺,其回调 功能将被触发一次阵列中的所有承诺都解决了 。
我已经实施了您的解决方案,并将最新更改推送到项目@ https://github.com/gigablox/angular-imgur-gallery/blob/master/app/js/controllers.js但是它仍然没有推迟承诺。马布我错过了什么? – 2013-05-08 13:52:23
使用$resource
承诺PR commit提名为1.1.3,我能包住$resource
电话与$ q和控制自己的异步behavoir的流动。
$scope.getAlbum = function(user, id, callback) {
var promise = Imgur.album.get({user:user, id:id}).$promise.then(
function(value){
return callback(value.data);
},
function(error){
//Something went wrong!
}
)
return promise;
}
$scope.getAlbums = function(user, callback) {
var prom = [];
$scope.albumsList.forEach(function (obj, i) {
var promise =
$scope.getAlbum(user, obj.id, function(value){
$scope.albums.push(value);
});
prom.push(promise);
});
$q.all(prom).then(function() {
callback();
});
};
$scope.getAlbums(user, function(){
// Totally works, bro.
console.log($scope.albums);
});
这正是我所需要的,但是,当我尝试使用外部资源数据时 - 它不符合它的承诺;)...您能否提供任何API数据(如Twitter)的示例? – 2013-05-08 00:39:56
由于您使用的'$ resource'也会返回一个承诺,所以您需要修改代码,以便它们一起链接承诺并调用'resolve()'启动整个机制。 – 2013-05-08 01:05:14
请参阅jsfiddle上的示例以更新模拟ajax文章。 – 2013-05-08 01:41:31