我确实需要您在以下方面提供帮助。 我查询 Firebase,按优先级(任务日期)获取任务列表,然后循环结果。 对于每个读取其相关作业(Firebase 中的另一个分支)的任务,将结果放在任务属性 (jobObject) 上,然后返回一个 promise 。
最后,$q.all 应该返回所有结果。但它就是行不通。
我在这里做错了什么? http://jsfiddle.net/danielchindea/R4M7x/1/
var startAt = '2014-03-01',
endAt = '2014-03-31',
promises = [];
var getTask = function (task) {
var d = $q.defer();
jobRef.child(task.jobId).on('value', function (jobSnapshoot) {
task.jobObject = jobSnapshoot.val();
d.resolve(task);
});
return d.promise;
};
taskRef.startAt(startAt).endAt(endAt).on('value', function (tasksSnapshoot) {
angular.forEach(_.values(tasksSnapshoot.val()), (function (task) {
if (task) {
promises.push(getTask(task));
}
}));
console.log('finish');
});
// it was $q.all($scope.promises) but this isn't the issue
$q.all(promises).then(function (result) {
$scope.events = result;
console.log('results' + result);
});
最佳答案
您的代码的问题是该 block 是异步的:
taskRef.startAt(startAt).endAt(endAt).on('value', function (tasksSnapshoot) {
并且当执行进一步的代码时,promises
仍然是一个空数组:
$q.all(promises).then(function (result) {
因为 promises
只是一个空数组(没有 Unresolved Promise)$q.all
在运行堆栈结束后立即触发(使用空数组结果)。
解决方案 - http://jsfiddle.net/R4M7x/7/
taskRef.startAt(startAt).endAt(endAt).on('value', function (tasksSnapshoot) {
angular.forEach(_.values(tasksSnapshoot.val()), (function (task) {
if (task) {
promises.push(getTask(task));
}
}));
$q.all(promises).then(function (result) {
$scope.events = result;
console.log('results' + result);
});
});
关于AngularJs $q.全部没有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199306/