2013-09-05 25 views
22

Folks,

mam konfigurację kodu nieco jak poniżej:

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

byłem pod wrażeniem, że „potem” funkcja będzie wywoływana tylko wtedy, gdy wszystkie zasoby zostać rozwiązanym. Jednak to nie jest to, co widzę w moim kodzie. Jeśli wydrukuję dane1, zostanę nierozwiązany.

Jakąkolwiek wskazówkę dotyczącą tego, czego tu brakuje?

+0

Czy 'resource1.query()', itp powrotu obietnica? ['all'] (http://docs.angularjs.org/api/ng.$q#all) oczekuje tablicy obietnic, a jeśli nie są obietnicami, zostaną uznane za natychmiastowe. –

+0

Używam kątowego 1.15 i zwraca coś takiego [$ resolved: false, $ then: function] Wierzę, że to jest obietnica – runtimeZero

+0

Należy zauważyć, że indeksy w tablicy wyników są oparte na zera, jak można oczekiwać od array, więc $ scope.data1 = wynik [0], itp. –

Odpowiedz

57

wpadłem na ten problem, i było to dość kłopotliwe. Problem polega na tym, że wywołanie akcji zasobów w rzeczywistości nie zwróci obietnicy http, ale puste odwołanie (które jest zapełniane, gdy dane wracają z serwera - patrz sekcja wartości zwracanej the $resource docs).

Nie jestem pewien, dlaczego tak się dzieje. Then (result) zwraca tablicę nierozwiązanych obietnic, ale aby uzyskać obietnicę każdego zasobu, należy użyć resource1.query().$promise. Aby ponownie wpisać swój przykład:

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

Mam nadzieję, że ktoś zaoszczędził trochę czasu.

+3

To jest naprawdę mylące i najlepiej mogę powiedzieć, że nie udokumentowano nigdzie. Bez "$ obietnicy" po wezwaniu do zasobu otrzymałem niespełnioną obietnicę., Co nie ma sensu. Dzięki za to. – blu

+0

To powinno być oznaczone jako odpowiedź na to pytanie. –

+0

Dzięki za milion !! – mgalic

0

drukowania dane1 nie $ scope.data1

console.log(data1); 

gdybym był tobą chciałbym użyć go w następujący sposób

$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, czy to naprawiło twój problem? –

0

Podobnie jak odpowiedź @cdidyks, wykorzystuje to $promise, ale moim zdaniem jest to lepszy wzorzec projektowy, ponieważ nie polega na tym, że wszystkie zasoby mają zostać ukończone w celu przypisania, i sprawia, że ​​obietnice $ są bardziej dostępne za mniej kodu.

$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

Dla tych wciąż próbuje wymyślić lepszego sposobu, aby go o tym, spróbuj tego:

resource.query().$promise.then(function(result) { 
    console.log(result); 
    // Do something else, like instantiate a JS driven table 
    });