AngularJS доступ к свойствам обещанного объекта в функции succes

0

У меня проблема, когда я действительно не могу опустить голову. Я использую базовый угловой http.get, который возвращает обещание:

getTask: function(id) {
    var promise = $http.get('http://localhost:9000/get/tasks/'+id).success(function(data) {
            return data;
        });
        return promise;
    }
TasksService.getTask($stateParams.id).then(function(success){
    $scope.task = success.data;
});

У задачи есть подсказки, которые я хочу получить, но она как-то всегда возвращает неопределенные. если я например делаю:

TasksService.getTask($stateParams.id).then(function(success){
    $scope.task = success.data;
    console.log($scope.task.deadline);
});

он не определен. Вы знаете, как я могу получить доступ к свойствам и как поделиться им с остальной частью моего контроллера?

  • 1
    покажи код для getTask
  • 0
    Я не могу обернуть голову вокруг вашего вопроса ... вы спрашиваете, почему ваши возвращенные данные не определены?
Показать ещё 2 комментария
Теги:
object
promise
http
angular-promise

3 ответа

0

Ах, спутанность .success против .then ударяет снова. Эта тонкая (и, на мой взгляд, совершенно ненужная) разница в том, что Угловое введение порождает множество проблем.

Проблема здесь в том, что .success возвращает первоначальное обещание и в этом отношении игнорирует возвращаемые вами data. Другими словами, он "отходит" и позволяет реализовать обработчик, который не влияет на остальную цепочку.

Чтобы исправить, используйте .then:

return $http.get(url).then(function(response) {
  return response.data;
});

Приложение:

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

promise.success = function(fn) {
   promise.then(function(response) {
     fn(response.data, response.status, response.headers, config);
   });

   // the original promise is returned, not the .then promise
   return promise;
}
-1

Исправьте это, выполнив следующее: $scope.task.task[0].deadline

  • 0
    Спасибо за размещение ответа на этот вопрос! Ответы только на код не рекомендуется использовать при переполнении стека, поскольку дамп кода без контекста не объясняет, как или почему будет работать решение, что делает невозможным для первоначального автора (или любых будущих читателей) понять логику, стоящую за ним. Пожалуйста, отредактируйте свой вопрос и включите объяснение вашего кода, чтобы другие могли получить пользу от вашего ответа.
-2

Я бы посоветовал вам проверять переменные с помощью метода Object.keys следующим образом:

 var obj = {};
 obj['key_1'] = 1;
 obj['key_2'] = 2;
 alert(Object.keys(obj));

Этот метод расскажет вам многое о свойствах переменных и поддерживаемых методах.

  • 0
    Интересно, почему люди голосуют против. В конце концов, пользователь нашел решение $scope.task.task[0].deadline и, действительно, с помощью Object.keys($scope.task) и дальнейшей проверки, и он наконец смог найти решение гораздо быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню