加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – $q.all承诺永远不会成就

发布时间:2020-12-17 17:14:13 所属栏目:安全 来源:网络整理
导读:我在feeds.forEach循环中的一个承诺最终会出错.也许是因为LoadData中的这个从不执行$rootScope.links = urls;那是在里面.怎么解决? app.service('LoadData',['FeedService','EntryStateUrlService','$q',function(FeedService,EntryStateUrlService,$q) { t
我在feeds.forEach循环中的一个承诺最终会出错.也许是因为LoadData中的这个从不执行$rootScope.links = urls;那是在里面.怎么解决?

app.service('LoadData',['FeedService','EntryStateUrlService','$q',function(FeedService,EntryStateUrlService,$q) {
   this.loadData = function(feedSrc) {

     FeedService.parseFeed(feedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(data) {
       console.log(data);
       $rootScope.links = data;
     });
   }
 }
]);

app.service('FeedService',function($http,$q) {
 this.parseFeed = function(url) {
   var deferred = $q.defer();
   $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url))
     .success(function(res) {

       deferred.resolve(res.data.responseData.feed.entries);
     }).error(function() {
       deferred.reject();
     });
   return deferred.promise;
 }
});

app.service('EntryStateUrlService',['$state',function($state,$q) {

   this.getEntryStateUrl = function(feeds) {

     var deferred = $q.defer();
     var idx = 0,promises = [],promise = null;
     feeds.forEach(function(e) {
       promise = $http.jsonp(e.link).success(function(data) {
         /*stuff*/
        e['entryStateUrl'] = data.link; // UPDATED
         deferred.resolve(data);
       });
       promises.push(promise);

     }); //forEach
     return $q.all(promises);
   }
 }
]);

UPDATE
我真的不明白$q.all作为一个很大的承诺对象如何组合许多其他承诺将提供数据服务LoadData ….

UPDATE2

It seems like,因为一个promise失败(因为其中一个url无效)$q.all失败并且永远不会对then().怎么绕过那个?我需要从所有成功的承诺中获取所有数据.

解决方法

有一点是你需要注入$rootScope才能使用它:

app.service('LoadData','$rootScope',$q,$rootScope) {
    //...
 }
]);

同样在Q库中有一个名为allSettled的方法,即使一个失败,也可以查看所有的promise结果.角度$q没有这种方法,但有几个人发现它很有用,所以他们为它创建了扩展.以下是Github Gist上的一个示例:

angular.module('qAllSettled',[]).config(function($provide) {
  $provide.decorator('$q',function($delegate) {
    var $q = $delegate;
    $q.allSettled = function(promises) {
      return $q.all(promises.map(function(promise) {
        return promise.then(function(value) {
          return { state: 'fulfilled',value: value };
        },function(reason) {
          return { state: 'rejected',reason: reason };
        });
      }));
    };
    return $q;
  });
});

使用此方法将返回所有结果,无论是否被拒绝.返回的对象将具有一个state属性,该属性将告诉您promise的状态:

return $q.allSettled(promises);

然后,您可以检查每个承诺的状态,并根据需要将其添加到链接:

FeedService.parseFeed(feedSrc)
    .then(EntryStateUrlService.getEntryStateUrl)
    .then(function(results) {
        $scope.links = [];
        results.forEach(function (result) {
            if (result.state === "fulfilled") {
                $scope.links.push(result.value);
            } else {
                var reason = result.reason;
            }
        });
});

Plunker Demonstration

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读