伙计们..
当我的程序开始时,我需要从大约 8 个不同的资源中检索数据。
这些资源相互独立,可以并行调用。(即我不需要一个数据来确定从另一个资源中检索什么)
然而,前面的任何事情都需要确保我拥有所有资源中的所有数据,因为它们相互操作。
因此,在我的控制器开始时,我使用以下代码调用了一个 init 函数:
*编辑更具体地说,我的确切代码如下
$scope.init = function () {
return $q.all([
Factory1.getCarData.query(), // returns a resource object like [$resolved: false, $then: function]
Factory2.getOtherData.query(), // returns a resource object like [$resolved: false, $then: function]
Factory3.getSomeOtherData.query() // returns a resource object like [$resolved: false, $then: function]
....,
resource8.query()]).then(result) {
$scope.data1 = result[1];
$scope.data2 = result1[2];...
$scope.data8 = result[3];
console.log($scope.data1); //prints as [$resolved: false, $then: function]
console.log($scope.data1[1]);
prints as undefined
doSomethingonData1($scope.data2);
doSomethingonData2($scope.data3, $scope.data4);..etc etc
}
}
其中 Factory1 定义为:
angular.module('app').factory('Factory1', function (Factory1Resource) {
var carPromise = Factory1Resource.query();
return {
getCarData: function(){ return carPromise;}
}
Factory1Resource 定义为:
.factory('Factory1Resource', ['$resource', function($resource) {
return $resource(myURL, {}, {} );
}])
使用工厂的重点是确保所有 8 种资源的数据操作都在控制器外部以单个单元完成。
我的意思是......我认为只有在所有资源都解决后才会调用“.then”函数。这意味着我的变量 $scope.data1、$scope.data2 等应该具有实际数据而不是资源对象。
当我执行 console.log($scope.data1) 时,情况并非如此。它打印为 [$resolved: false, $then: function]
这打破了我的程序流程。
现在我认为我已经阅读了很多关于承诺和资源的内容,我现在是一个开明的人,但显然我在这里遗漏了一些东西。
我想要的是我的变量($scope.data1、$scope.data2 等)都包含实际数据。
有什么提示吗?或者,您可以随意提出关于我应该如何布置代码的任何更好的想法。