2013-09-05 45 views
22

Folks,

tôi đã thiết lập mã của tôi hơi như sau:

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

Tôi đã theo ấn tượng rằng "sau đó" chức năng sẽ được gọi là chỉ khi tất cả các nguồn lực được giải quyết. Tuy nhiên đây không phải là những gì tôi nhìn thấy trong mã của tôi. Nếu tôi in dữ liệu1, tôi sẽ không được giải quyết.

Bất kỳ đầu mối nào về những gì tôi thiếu ở đây ??

+0

Liệu 'resource1.query() 'vv trả về một Promise? ['all'] (http://docs.angularjs.org/api/ng.$q#all) mong đợi một Array of Promises, và nếu chúng không phải là Promises, chúng sẽ được xem xét ngay lập tức. –

+0

Tôi đang sử dụng góc 1.15 và nó trả về một cái gì đó như thế này [$ giải quyết: false, $ then: function] Tôi tin đây là lời hứa – runtimeZero

+0

Xin lưu ý rằng các chỉ số trong mảng kết quả là không dựa trên như mong đợi của một mảng, do đó $ scope.data1 = result [0], v.v. –

Trả lời

57

Tôi chạy vào vấn đề này, và nó đã được khá khó hiểu. Vấn đề dường như là gọi hành động tài nguyên không thực sự trả lại lời hứa http, nhưng tham chiếu trống (được điền khi dữ liệu được trả về từ máy chủ - xem phần giá trị trả lại của the $resource docs).

Tôi không chắc tại sao kết quả này lại. Kết quả trả về một loạt các lời hứa chưa được giải quyết, nhưng để nhận lời hứa của mỗi tài nguyên, bạn cần sử dụng resource1.query().$promise. Để viết lại ví dụ của bạn:

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

Tôi hy vọng sẽ tiết kiệm cho người khác một thời gian.

+3

Điều này thực sự khó hiểu và tốt nhất tôi có thể nói không được ghi lại ở bất cứ đâu. Không có '' '$ promise''' sau cuộc gọi tài nguyên, tôi đã nhận được một lời hứa chưa được điền đầy đủ. Điều này không có ý nghĩa gì cả. Cám ơn vì cái này. – blu

+0

Điều này sẽ được đánh dấu là câu trả lời cho câu hỏi này. –

+0

Cảm ơn một triệu !! – mgalic

0

bạn đang in data1 không $ scope.data1

console.log(data1); 

nếu tôi là bạn tôi sẽ sử dụng nó như sau

$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

@James Hans, điều này có khắc phục được sự cố của bạn không? –

0

Giống như @cdidyks trả lời điều này sử dụng $promise, nhưng theo ý kiến ​​của tôi nó là một mẫu thiết kế tốt hơn vì nó không dựa vào tất cả các tài nguyên được hoàn thành để gán, và làm cho $ hứa hẹn dễ tiếp cận hơn trong mã ít hơn.

$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

Đối với những người vẫn đang cố gắng tìm ra một cách tốt hơn để đi về vấn đề này, hãy thử này:

resource.query().$promise.then(function(result) { 
    console.log(result); 
    // Do something else, like instantiate a JS driven table 
    }); 
Các vấn đề liên quan