23

伙计们,

我的代码设置如下:

$scope.init = function(){
  return $q.all([resource1.query(),resource2.query(),resource3.query()])
            .then(result){
               $scope.data1 = result[1];
               $scope.data2 = result1[2];
               $scope.data3 = result[3];


               console.log(data1); //prints as [$resolved: false, $then: function]

               doSomething($scope.data1,$scope.data2); 
                 }
}

我的印象是只有当所有资源都得到解决时才会调用“then”函数。然而,这不是我在我的代码中看到的。如果我打印 data1,我将无法解决。

关于我在这里缺少什么的任何线索?

4

4 回答 4

57

我遇到了这个问题,这很混乱。问题似乎是调用资源操作实际上并没有返回 http 承诺,而是一个空引用(当数据从服务器返回时填充 - 请参阅 $resource 文档的返回值部分)。

我不确定为什么这会导致 .then(result) 返回一组未解决的承诺,但要获得每个资源的承诺,您需要使用 .then(result) resource1.query().$promise。重写你的例子:

$scope.init = function() {
  return $q.all([resource1.query().$promise, resource2.query().$promise, resource3.query().$promise])
           .then( function(result) {
             $scope.data1 = result[0];
             $scope.data2 = result[1];
             $scope.data3 = result[2];

             console.log($scope.data1);

             doSomething($scope.data1,$scope.data2); 
           })
}

我希望这可以节省其他人一些时间。

于 2013-10-08T22:33:58.777 回答
0

您正在打印 data1 而不是 $scope.data1

console.log(data1);

如果我是你,我会按如下方式使用它

$scope.init = function(){
return $q.all([resource1.query(),resource2.query(),resource3.query()])
        .then(result){
          console.log(result[1]);
           $scope.data1 = result[1];
           $scope.data2 = result1[2];
           $scope.data3 = result[3];

           doSomething($scope.data1,$scope.data2); 
             }
}
于 2013-09-05T22:33:47.280 回答
0

就像@cdidyks 回答这个一样$promise,但在我看来,这是一种更好的设计模式,因为它不依赖于完成分配的所有资源,并且使得 $promises 在更少的代码中更容易访问。

$scope.data1 = resource1.query();
$scope.data2 = resource2.query();
$scope.data3 = resource3.query();

$scope.init = function() {
  return $q.all([
      $scope.data1.$promise,
      $scope.data2.$promise,
      $scope.data3.$promise
    ])
    .then(function(result) {
        console.log('all done');
      doSomething($scope.data1, $scope.data2);
    })
}
于 2016-01-28T10:18:56.567 回答
0

对于那些仍在试图找出更好的方法来解决这个问题的人,试试这个:

  resource.query().$promise.then(function(result) {
    console.log(result);
    // Do something else, like instantiate a JS driven table
  });
于 2016-10-24T15:33:34.580 回答