Angular Resource calls and $q

前端 未结 4 774
失恋的感觉
失恋的感觉 2020-12-24 02:37

Folks,

I have my code setup somewhat as below:

$scope.init = function(){
  return $q.all([resource1.query(),resource2.query(),resource3.query()])
            


        
相关标签:
4条回答
  • 2020-12-24 02:52

    For those still trying to figure out a better way to go about this, try this:

      resource.query().$promise.then(function(result) {
        console.log(result);
        // Do something else, like instantiate a JS driven table
      });
    
    0 讨论(0)
  • 2020-12-24 02:54

    Like @cdidyks answer this utilises $promise, but in my opinion it is a better design pattern as it doesn't rely on all resources to be completed for assignment, and makes the $promises more accessible in less code.

    $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);
        })
    }
    
    0 讨论(0)
  • 2020-12-24 03:03

    I ran into this problem, and it was quite confusing. The problem appears to be that calling a resource action doesn't actually return an http promise, but an empty reference (that is populated when the data returns from the server -see the return value section of the $resource docs).

    I'm not sure why this results in .then(result) returning an array of unresolved promises, but to get each resource's promise, you need to use resource1.query().$promise. To re-write your example:

    $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); 
               })
    }
    

    I hope that saves someone else some time.

    0 讨论(0)
  • 2020-12-24 03:11

    you are printing data1 not $scope.data1

    console.log(data1);
    

    if i were you i would use it as follows

    $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); 
                 }
    }
    
    0 讨论(0)
提交回复
热议问题