Работа с услугами AngularJS, $ http и контроллерами [дубликат]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

4
задан Coop 18 December 2014 в 13:34
поделиться

2 ответа

Вам нужно понять, что вы не можете вернуться из асинхронных операций. Ответ просто не доступен, когда вы пытаетесь вернуть данные. Как правило, в Javascript вы должны использовать обратный вызов или шаблон обещания. В угловом обещании очень естественный выбор.

app.service("GetDivision", ["$http", function($http) {
  this.division = function(divisionNumber){
    return $http.post("/api/division", {division:divisionNumber}).success(function(data){
      return data;
    });
  }
}]);

и в контроллере:

GetDivision.division(1).then(function(data) {
    $scope.division = data;
});

Убедитесь, что вы прочитали этот очень популярный поток по теме: Как сделать Я возвращаю ответ от асинхронного вызова?

8
ответ дан Community 27 August 2018 в 06:18
поделиться

Вы можете вернуть пустой объект из своей службы и заполнить его после получения ответа. Так поступают службы $resource . Это также позволяет избежать дополнительной логики в контроллере.

Это будет работать, потому что ссылка на объект data, который помещается в область действия, остается неизменной все время, а $http служба начинает цикл дайджест после ответа вернулся. Поэтому изменение в scope.division будет немедленно обнаружено, и просмотр будет соответствующим образом обновлен.

JavaScript

var app = angular.module('app',[]);

app.service("GetDivision", ["$http", function($http){

  var data = {};

  this.division = function(divisionNumber){
    $http.get("division", {division:divisionNumber}).success(function(responseData){
      angular.extend(data, responseData);
    });
    return data;
  } 

}]);

app.controller('ctrl', ['$scope', 'GetDivision', function ($scope, GetDivision) {
  $scope.division = GetDivision.division(1);
}]);

HTML

<body ng-controller="ctrl">
  <h1>{{division.text}}</h1>
</body>

Live Demo : http://plnkr.co/edit/H31mSaXiiCiVG9BA9aHK?p=preview

1
ответ дан Vadim 27 August 2018 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: