【发布时间】:2016-09-28 18:52:32
【问题描述】:
我设计了一个服务,它接受一些参数,然后循环输入数组,找出哪个项目是空的,然后将它们添加到数组中,然后在 $q.all 解决之后它应该给我空项目的数组.
输入是项目数组
function getElements(inputs) {
var elements= [],
promise, whenPromise,
promises = [],
mainPromise = $q.defer();
if (inputs.length === 0) {
mainPromise.resolve(elements);
return mainPromise.promise;
}
angular.forEach(inputs, function (input) {
promise = getPromises(input);
whenPromise = $q.resolve(promise).then(function (response) {
$timeout(function() {
if (response.isEmpty) {
**//perform action with the response.data;**
}
});
}, function () {
});
promises.push(whenPromise);
});
$q.all(promises).finally(function () {
mainPromise.resolve(outdatedEntities);
});
return mainPromise.promise;
}
function getPromises(input) {
var deferred = $q.defer();
someSerivce.getItemDetails(input.Id).then(function (value) {
if (value === null) {
$timeout(function () {
deferred.resolve({data: input, isEmpty: true});
});
} else {
//have item locally, but need to see if it's current
input.isEmpty().then(function (isEmpty) {
$timeout(function () {
deferred.resolve({data: input, isEmpty: isEmpty});
});
}, function (error) {
deferred.reject(error);
});
}
});
return deferred.promise;
}
现在,问题是 $q.all 永远无法解决。尽管所有的内部承诺都得到了解决。
【问题讨论】:
-
每个承诺的此代码是否已到达
if (response.isEmpty) {? -
是的,但是在 $timout 包裹之后
-
在 $timout 包裹之后 - 你是什么意思?
-
$timeout(function () { if (response.isOutDated) { addUniqueEntity(outdatedEntities, response.item); } });
-
我在您的代码中看不到这一点。更新您的代码。以及为什么你在
getPromises中将所有内容都包裹在超时中,比如$timeout(function () { deferred.resolve({data: input, isEmpty: true}); });
标签: javascript angularjs angular-promise