【问题标题】:How to execute all promises in angular before proceding?在继续之前如何以角度执行所有承诺?
【发布时间】:2018-03-03 07:58:23
【问题描述】:

我必须从互联网上收集数据才能展示它,并且我正在使用 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 代码之前,需要收集所有专辑封面。为了在运行 finally 函数之前运行所有请求,我应该更改什么?

我已将此代码用作参考,并且在网上搜索了很长时间其他参考: https://gist.github.com/slavafomin/8ee69f447765bc5c5e19

【问题讨论】:

  • 你需要 $q.all() var promiseHash = {}; promiseHash.data = Data.query().$promise; $q.all(promiseHash)
  • 是的,您不应该使用超时。您应该只使用 get a promise for the api call 并使用它。

标签: javascript angularjs promise angular-promise


【解决方案1】:

请尝试:

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/

【讨论】:

  • 恕我直言,可以在逻辑块之间添加换行符以提高可读性。
  • 它不是一直有效,似乎是随机的,有时我会得到 9 个专辑,有时是 8 个,而正确的是一直得到 11 个......
  • @JaquelinePassos 您能否提供有关您正在使用的 facebookConnectPlugin 的更多信息? facebookConnectPlugin.api(***) 方法是否返回承诺?
  • 嗨@JosuéMorales,谢谢。它没有。它返回一个对象。 facebookConnectPlugin.api(字符串请求路径,数组权限,函数成功,函数失败)'。成功函数返回一个对象。
猜你喜欢
  • 2021-08-11
  • 2017-07-31
  • 1970-01-01
  • 2018-12-14
  • 2020-06-24
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
相关资源
最近更新 更多