javascript - 如何在继续之前执行 Angular 中的所有 promise ?

标签 javascript angularjs promise angular-promise

我必须从互联网收集数据才能展示它,并且我正在使用 promise 来实现它。我需要完成所有请求才能继续处理代码。在执行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,但这是我发现让它工作的唯一方法。此外,有时它不会返回所有请求。我肯定做错了什么。如果我使用更高的 $timeout 值,例如 5000,我可以获得所有值,但我不想依赖它来使其工作。在执行最终代码之前需要收集所有专辑封面。为了在运行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 参数。请参阅上面我的更新。

请引用https://developers.facebook.com/docs/graph-api/了解更多信息。

关于javascript - 如何在继续之前执行 Angular 中的所有 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060012/

相关文章:

Angularjs/Ionic 总是显示小数点后 2 位

javascript - 在 Promise.all 中 react setState

javascript - 在 Node.js 中使用 ES6 Promise 返回空响应

javascript - 用于渐变的 CSS3 Javascript 库?

javascript - 如何将 JavaScript 添加到我的 Tumblr 博客上的每个非索引页面?

javascript - 异步调用 AngularJS 不适用于 Canvas HTML

javascript - 如何使用 ng-repeat 将 API 调用返回到 View 的对象数量设为 'print'?

javascript - 在 Promise.all() 中包装 localForage setItem 调用

javascript - 将组件重新绘制为 PNG

javascript - 仅当视口(viewport)宽度大于 1000 像素时才运行 WayPoints?