我正在使用$ q并检查是否所有$ http.get服务调用都已完成。在一个$ http调用中,有一个嵌套的$ http.get调用(在success函数中进行)。 $ q.allSettled不会等到嵌套的$ http调用完成。如何处理这种情况?
var promises = [];
var promise = $http.get(url1).success(function(data){
$http.get(url2).success(function(data){
console.log("success2");
}).error(function(data){console.log("failue2")});
})).error(function(data){
console.log("failure1")
});
promises.push(promise);
$q.allSettled(promises).then(function(data){
console.log("log3");
});
我使用的是改进版本$ q。这是代码
angular.module("qImproved", [])
.config(function($provide) {
$provide.decorator("$q", function($delegate) {
function allSettled(promises) {
var deferred = $delegate.defer(),
counter = 0,
results = angular.isArray(promises) ? [] : {};
angular.forEach(promises, function(promise, key) {
counter++;
$delegate.when(promise).then(function(value) {
if (results.hasOwnProperty(key)) {
return;
}
results[key] = {
status: "fulfilled",
value: value
};
if (!(--counter)) {
deferred.resolve(results);
}
}, function(reason) {
if (results.hasOwnProperty(key)) {
return;
}
results[key] = {
status: "rejected",
reason: reason
};
if (!(--counter)) {
deferred.resolve(results);
}
});
});
if (counter === 0) {
deferred.resolve(results);
}
return deferred.promise;
}
$delegate.allSettled = allSettled;
return $delegate;
});
});
答案 0 :(得分:1)
你的promises数组(虽然它被命名为复数)只包含一个promise。
如果要异步运行这些函数,则需要添加promises数组。
或者如果你想同步运行它们,那么不要只是$ q。只需将您的回调代码放在最后then/success
您可以使用$q.defer()
来创建新的承诺
将此承诺添加到promises数组中,并仅在最终的嵌套回调中解析它。
然后你将解决承诺链何时竞争,而不仅仅是第一个承诺。