簡體   English   中英

如何在執行之前按角度執行所有承諾?

[英]How to execute all promises in angular before proceding?

我必須從互聯網上收集數據才能顯示它,而我正在使用諾言來實現它。 我需要完成所有請求才能繼續執行代碼。 在執行最后之前,我需要完成所有請求。 這是代碼:

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/了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM