我真的需要你的帮助以下。 我查询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);
});
答案 0 :(得分:2)
您的代码存在的问题是此块是异步的:
taskRef.startAt(startAt).endAt(endAt).on('value', function (tasksSnapshoot) {
当执行进一步的代码时,promises
仍然是一个空数组:
$q.all(promises).then(function (result) {
因为promises
只是一个空数组(没有未解析的promises)$q.all
在运行堆栈结束后立即被触发(结果为空数组)。
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);
});
});
答案 1 :(得分:1)
你的问题是你在$ scope.promises上运行$ q.all而不是承诺