-2

伙计们..

当我的程序开始时,我需要从大约 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 等)都包含实际数据。

有什么提示吗?或者,您可以随意提出关于我应该如何布置代码的任何更好的想法。

4

3 回答 3

0

@sza 非常感谢您在这里的建议和帮助。这似乎是正确的方法,但是为了有一个万无一失的系统,我做了以下事情:

".then"在all 部分设置标志Factory.getData.query()- 所以现在代码如下所示:

Factory1.getCarData.query().then(function(){Data1Retrieved == true}) 

在此之后,我会监视所有标志,一旦所有标志变为真,我就会开始其余的处理。同样,我不知道这是否是正确的方法,但它似乎确实有效。

再次感谢大家的意见。

于 2013-09-07T17:06:47.380 回答
0

then()接受一个函数,这样做

.then(function(result) {
    $scope.data1 = result[1];
    ...
});

为您创建了一个演示,我简化了一些代码。它工作正常。Demo

于 2013-09-06T16:14:50.530 回答
-1

resource.query而不是直接将返回的对象传递给$q.all(您应该传递resource.query().$promise.

根据角度 $resource 文档

Resource 实例和集合具有以下附加属性:

$promise:创建此实例或集合的原始服务器交互的承诺。

http://docs.angularjs.org/api/ngResource .$resource

更新

我决定使用我开发的现有应用程序自己创建一个测试。我将粘贴对我有用的代码。当您调用资源时,也许您有不同的结构:

 $provide.factory('GenericResource', ['$resource','$q', function($resource,$q){
        var AccountResource = $resource('/user/accounts/balances'),
            BankResource = $resource('/banks');

        $q.all([AccountResource.query().$promise, BankResource.query().$promise]).then(function(data){
            console.log(data);
        });
    }]);

console.log 的输出是:

[
Array[3]
    0: Resource
    1: Resource
    2: Resource
    $promise: Object
    $resolved: true
    length: 3
    __proto__: Array[0]
, 
    Array[4]
    0: Resource
    1: Resource
    2: Resource
    3: Resource
    $promise: Object
    $resolved: true
    length: 4
    __proto__: Array[0]
]

如您所见,返回的数据包含 3 个和 4 个资源对象,代表所获取的数据。这个结果和你的结果相似吗?

于 2013-09-06T14:30:20.413 回答