AngularJs $ q.all没有数据

时间:2014-06-13 06:49:17

标签: angularjs

我真的需要你的帮助以下。 我查询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);
        });

2 个答案:

答案 0 :(得分:2)

您的代码存在的问题是此块是异步的:

taskRef.startAt(startAt).endAt(endAt).on('value', function (tasksSnapshoot) {

当执行进一步的代码时,promises仍然是一个空数组:

$q.all(promises).then(function (result) {

因为promises只是一个空数组(没有未解析的promises)$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);
    });
});

答案 1 :(得分:1)

你的问题是你在$ scope.promises上运行$ q.all而不是承诺