通过 angularjs $resource 获取数据

Get data by angularjs $resource

我有以下通过 $resource 获取数据的 angularJS 函数,它可以工作并将这些数据推送到 vm.data 数组,但是当我尝试在控制器中获取 vm.data我得到空值,下面代码的最后一行打印空值

   function loadAll() {
    Questiongroup.query({}).$promise.then(function(group){
        console.log(group);
        for(var i=0;i<group.length;i++){
           var grouptitle=group[i].title
            Question.questionsByQuestionGroup({id:group[i].id}).$promise.then(function(question){
                vm.question = question; 
               for(var j=0;j<question.length;j++){
                   vm.data.push({ group: grouptitle, question: question[j].question , questiontype: question[j].type });

                   console.log(vm.data)      //this line print correct data 
                   }
         });
        }
      });
    }

    loadAll();
    console.log(vm.data);         //This line print null

last console.log 打印 null 的原因是它在 赋予 .then 方法的功能之前执行 。作为 .then 方法参数的函数由 $q 服务 来自服务器的数据 return 之后调用。

loadAll 函数应该 return 派生的承诺,可用于检索 vm.data after正在组装中。这涉及 链接 承诺和使用 $q.all 方法。

function loadAll() {
    var topPromise = Questiongroup.query({}).$promise;

    var derivedPromise = topPromise.then(function(group){
        var promiseList = [];
        console.log(group);
        for(var i=0;i<group.length;i++){
            var itemPromise  = getItemPromise(group[i]);
            promiseList.push(itemPromise);                        
        };
        //return $q.all promise for chaining
        return $q.all(promiseList);
    });

    //return promise
    return derivedPromise;
};

然后使用 returned 承诺。

var loadAllPromise = loadAll();

loadAllPromise.then(function (vmData) {
    console.log(vmData);
});

上面的示例显示了如何创建一个承诺,该承诺 return 是一个承诺数组中的一个数据数组。将其扩展到多级迭代在直觉上是显而易见的。


AngularJS $q.all 也适用于散列。

function loadAll() {
    var topPromise = Questiongroup.query({}).$promise;

    var derivedPromise = topPromise.then(function(group){
        var promiseHash = {};
        console.log(group);
        for(var i=0;i<group.length;i++){
            var itemPromise  = getItemPromise(group[i]);
            promiseHash[group[i].id] = itemPromise;                        
        };
        //return $q.all promise for chaining
        return $q.all(promiseHash);
    });

    //return promise
    return derivedPromise;
};

上面的例子return是一个包含数据散列(关联数组)的承诺。

loadAllPromise.then(function (dataHash) {
    console.log(dataHash);
});

来自文档:

all(promises);

Combines multiple promises into a single promise that is resolved when all of the input promises are resolved.

Parameters

An array or hash of promises.

Returns

Returns a single promise that will be resolved with an array/hash of values, each value corresponding to the promise at the same index/key in the promises array/hash. If any of the promises is resolved with a rejection, this resulting promise will be rejected with the same rejection value.

--AngularJS $q Service API Reference -- $q.all