$q 不等到嵌套的 $http 调用完成
$q not waiting till the nested $http call completes
我正在使用 $q 并检查所有 $http.get 服务调用是否已完成。在一个 $http 调用中,有一个嵌套的 $http.get 调用(在成功函数中进行)。 $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;
});
});
您的 promises 数组(虽然它被命名为复数)只包含一个 promise。
如果您想 运行 这些函数异步,则需要将它们添加到 promises 数组中。
或者如果你想 运行 他们同步那么不要只是 $q。只需将您的回调代码放在最后 then/success
编辑
您可以使用 $q.defer()
创建一个新的承诺。
将此承诺添加到您的承诺数组中,并仅在您最终的嵌套回调中解决它。
然后你将在承诺链竞争时解决,而不仅仅是第一个承诺。
我正在使用 $q 并检查所有 $http.get 服务调用是否已完成。在一个 $http 调用中,有一个嵌套的 $http.get 调用(在成功函数中进行)。 $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;
});
});
您的 promises 数组(虽然它被命名为复数)只包含一个 promise。
如果您想 运行 这些函数异步,则需要将它们添加到 promises 数组中。
或者如果你想 运行 他们同步那么不要只是 $q。只需将您的回调代码放在最后 then/success
编辑
您可以使用 $q.defer()
创建一个新的承诺。
将此承诺添加到您的承诺数组中,并仅在您最终的嵌套回调中解决它。
然后你将在承诺链竞争时解决,而不仅仅是第一个承诺。