Подтвердить что ты не робот

Angular Запросы ресурсов и $q

Люди,

У меня есть моя настройка кода, как показано ниже:

$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, я не буду решен.

Любая подсказка о том, чего я здесь не вижу?

4b9b3361

Ответ 1

Я столкнулся с этой проблемой, и это было довольно запутанно. Проблема состоит в том, что вызов действия ресурса фактически не возвращает обещание на http, а пустую ссылку (которая заполняется, когда данные возвращаются с сервера - см. Раздел возвращаемого значения Документы $resource).

Я не уверен, почему это приводит к .then(result) возвращению массива неразрешенных promises, но чтобы получить каждый ресурс, вам нужно использовать 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); 
           })
}

Надеюсь, что кто-то сохранит какое-то время.

Ответ 2

вы печатаете данные1, а не $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); 
             }
}

Ответ 3

Как и @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);
    })
}

Ответ 4

Для тех, кто все еще пытается найти лучший способ сделать это, попробуйте следующее:

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