gpt4 book ai didi

angularjs - $q.all promise 永远不会兑现

转载 作者:行者123 更新时间:2023-12-04 06:48:03 24 4
gpt4 key购买 nike

我在 feeds.forEach 期间的 promise 之一循环以错误结束。也许是因为 LoadData从不执行行 $rootScope.links = urls;里面是 then .如何解决?

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', '$q',
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);
}
}
]);

更新
我不太明白 $q.all作为一个大的 promise 对象,许多其他 promise 的组合将提供 data服务 LoadData ……

更新2

It seems like因为一个 promise 失败(因为其中一个网址无效) $q.all失败并且永远不会达到 then() .如何解决这个问题?我需要从所有成功的 promise 中获取所有数据。

最佳答案

一件事是您需要注入(inject) $rootScope为了使用它:

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

在 Q 库中还有一个名为 allSettled 的方法。这将允许您查看所有的 promise 结果,即使其中一个失败。 angular $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);

然后您可以检查每个 Promise 的状态并根据需要将其添加到链接中:
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

关于angularjs - $q.all promise 永远不会兑现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com