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 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Couldn't register with the bootstrap server错误
- scala – spark streaming kafka – spark session API
- vim – 你如何在光标下直接*号*
- twitter-bootstrap – Yii2 Advanced – 扩展视图以添加自定
- 解决WebService 第一次慢的问题 在wince下
- angularjs – 如何使用Controller As符号访问父属性
- 用于自定义可重用组件的Angular2数据绑定
- webservice实例(一)
- CM开发日志 - 本地环境搭建
- scala – 如何在swagger中隐藏参数?