AngularJS $promise then() данные не определены

Я пытаюсь получить данные, назначенные переменной $scope. Внутри моей функции $promise.then() она отображается правильно, но вне функции она отображается как неопределенная. Ниже приведен код моего контроллера:

angular.module('testSiteApp').controller('TestController', function ($scope, Tests) { 

$scope.test = Tests.get({id: 1});

$scope.test.$promise.then(function(data) {
    $scope.tasks = data.tasks;
    console.log($scope.tasks);
});

console.log($scope.tasks); 

});

Результаты внутри функции then():

[Object, Object, Object, Object]

Результаты вне функции then():

undefined

Фабрика услуг «Тесты», которую я использую, выглядит следующим образом:

angular.module('testSiteApp').factory('Tests', function($resource) {

return $resource('/api/test/:id', {id: '@id'}, { 'update': { method: 'PUT' } } );

});

Даже когда я использую метод запроса вместо get для своего ресурса и устанавливаю для isArray значение true, я все равно сталкиваюсь с той же проблемой. По какой-то причине данные не привязаны к моей области внутри функции then.

Извините, если это повторяющийся вопрос, но я искал везде и нашел только неопределенную проблему, связанную с функцией $promise, которая в данном случае не является проблемой.

Заранее спасибо за поддержку.


person typemiguel    schedule 12.08.2014    source источник


Ответы (4)


Функция, переданная .then(), будет вызываться после того, как данные будут получены из бэкенда. Другой console.log() (тот, что за пределами .then()) будет вызываться сразу после того, как запрос будет сделан, а не после его выполнения, поэтому tasks не определен.

Рассмотрим время (конечно, время — это только пример):

// time = 0.000 sec. You make a request to the backend
$scope.test = Tests.get({id: 1});

$scope.test.$promise.then(function(data) {
    // time = 1.000 sec. Request is completed. 
    // data is available, so you assign it to $scope.tasks
    $scope.tasks = data.tasks;
    console.log($scope.tasks);
});

// time = 0.000 sec (!!!) This has been called NOT AFTER
// the callback, but rather immediately after the Tests.get()
// So the data is not available here yet.
console.log($scope.tasks); 
person kamituel    schedule 12.08.2014

Это обещание, поэтому $scope.task устанавливается после возврата. Пока этот возврат не произойдет, $scope.task не определен, что и показывает ваш второй console.log. Через какое-то время обещание разрешается (завершается), и $scope.task имеет значение, которое показывает ваш первый console.log.

person JerryKur    schedule 12.08.2014
comment
Я понимаю проблему, но как заставить прицел ждать? или это просто плохой код? - person J'e; 17.12.2015

$scope.test.$promise.then(function(data) {

if(data){    
$scope.tasks = data.tasks;
}

console.log($scope.tasks);
});

попробуй это

person Khurshid Imran    schedule 12.07.2016
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person HiDeo; 12.07.2016

Этот код поможет вам получить данные и решить с помощью обещания, обратите внимание, что данные выборки будут работать только после вызова...

getData(){
      const promise = this.httpClient.get(this.PHP_API_SERVER+'/api/books').toPromise();  
      promise.then((data)=>{
        console.log("Resolved: " + JSON.stringify(data));
        return JSON.stringify(data);
      }, (error)=>{
        console.log("Rejected " + JSON.stringify(error));
      })
    }
person lucasvm1980    schedule 11.11.2019