如何在继续之前执行 angular 中的所有承诺?
How to execute all promises in angular before proceding?
我必须从互联网上收集数据才能显示它,并且我正在使用 promises 来实现它。我需要完成所有请求才能继续执行代码。在执行 finally 之前,我需要完成所有请求。这是代码:
var start = function(){
$rootScope.albums = [];
var albums = [];
facebookConnectPlugin.api('/me?fields=albums{cover_photo,name}&access_token=' + $scope.user.authResponse.accessToken, [],
function (response) {
$ionicLoading.show();
var alb = response.albums.data; // array
var sequence = $q.all([]);
angular.forEach(alb, function(album) {
sequence = sequence.then(function() {
return $timeout(function () {
facebookConnectPlugin.api('/' + album.cover_photo.id + '?fields=picture&access_token=' + $scope.user.authResponse.accessToken, null,
function (response) {
album.c = response.picture;
albums.push(album);
},
function (errObj) {
alert(JSON.stringify(errObj));
});
},100);
});
});
sequence.finally(function () {
$rootScope.albums = albums;
$ionicLoading.hide();
$state.go('tab.albums');
});
},function (response) {
alert(JSON.stringify(response));
});
}
我认为我不应该使用 $timeout,但这是我发现让它工作的唯一方法。此外,有时它不会 return 所有请求。我肯定做错了什么。如果我使用更高的 $timeout 值,如 5000,我可以获得所有值,但我不想依赖它来使其工作。在执行 finally 代码之前,需要收集所有专辑封面。为了 运行 在 运行 finally 函数之前的所有请求,我应该更改什么?
我参考了这段代码,也在网上搜索了很久其他的参考资料:
https://gist.github.com/slavafomin/8ee69f447765bc5c5e19
请尝试:
var start = function(){
$rootScope.albums = [];
facebookConnectPlugin.api('/me?fields=albums{cover_photo{picture},name}&access_token=' + $scope.user.authResponse.accessToken, [],
function (response) {
$ionicLoading.show();
var albums = response.albums.data.map(album => {
album.c = album.cover_photo.picture;
return album;
});
$rootScope.albums = albums;
$ionicLoading.hide();
$state.go('tab.albums');
},function (response) {
alert(JSON.stringify(response));
});
}
编辑: 你不需要使用 angular $q 服务,你只需要改变你的 requestPath 参数。请看我上面的更新。
我必须从互联网上收集数据才能显示它,并且我正在使用 promises 来实现它。我需要完成所有请求才能继续执行代码。在执行 finally 之前,我需要完成所有请求。这是代码:
var start = function(){
$rootScope.albums = [];
var albums = [];
facebookConnectPlugin.api('/me?fields=albums{cover_photo,name}&access_token=' + $scope.user.authResponse.accessToken, [],
function (response) {
$ionicLoading.show();
var alb = response.albums.data; // array
var sequence = $q.all([]);
angular.forEach(alb, function(album) {
sequence = sequence.then(function() {
return $timeout(function () {
facebookConnectPlugin.api('/' + album.cover_photo.id + '?fields=picture&access_token=' + $scope.user.authResponse.accessToken, null,
function (response) {
album.c = response.picture;
albums.push(album);
},
function (errObj) {
alert(JSON.stringify(errObj));
});
},100);
});
});
sequence.finally(function () {
$rootScope.albums = albums;
$ionicLoading.hide();
$state.go('tab.albums');
});
},function (response) {
alert(JSON.stringify(response));
});
}
我认为我不应该使用 $timeout,但这是我发现让它工作的唯一方法。此外,有时它不会 return 所有请求。我肯定做错了什么。如果我使用更高的 $timeout 值,如 5000,我可以获得所有值,但我不想依赖它来使其工作。在执行 finally 代码之前,需要收集所有专辑封面。为了 运行 在 运行 finally 函数之前的所有请求,我应该更改什么?
我参考了这段代码,也在网上搜索了很久其他的参考资料: https://gist.github.com/slavafomin/8ee69f447765bc5c5e19
请尝试:
var start = function(){
$rootScope.albums = [];
facebookConnectPlugin.api('/me?fields=albums{cover_photo{picture},name}&access_token=' + $scope.user.authResponse.accessToken, [],
function (response) {
$ionicLoading.show();
var albums = response.albums.data.map(album => {
album.c = album.cover_photo.picture;
return album;
});
$rootScope.albums = albums;
$ionicLoading.hide();
$state.go('tab.albums');
},function (response) {
alert(JSON.stringify(response));
});
}
编辑: 你不需要使用 angular $q 服务,你只需要改变你的 requestPath 参数。请看我上面的更新。