Использование двух методов $http и сохранение данных в объекте Angular

Я пытаюсь получить данные из одного ресурса в контроллере, и в результате мне нужно сделать второй HTTP-запрос на получение.

    $http.get('http://' + ProductionConfig.SERVER + '/api/v1/business-config/').then(function (res) {
        $scope.selected= res.data;
        console.log($scope.selected);
    }, function (err) {
        console.error('No se ha podido conseguir los datos de empresa ' + err);
    });

    $http.get('http://' + ProductionConfig.SERVER + '/api/v1/business/id/' + $scope.selected).then(function (res) {
        $scope.business= res.data;
        console.log($scope.business);
    }, function (err) {
        console.error('No se ha podido conseguir los datos de empresa ' + err);
    });

Но когда я пытаюсь выполнить второй $http.get, $scope.selected не определен, и он возвращает мне ошибку, потому что не удалось выполнить запрос. После этого я должен сохранить результат в объекте, чтобы использовать его позже.

Как я могу поставить эту проблему? Спасибо.


person JesusMurF    schedule 16.06.2015    source источник
comment
Поместите второй http.get внутрь then первого   -  person Joao Leal    schedule 16.06.2015
comment
@JoaoLeal да, я это доказал, но тогда $scope.business не определен, когда мне приходится использовать его вне метода $http для сохранения в объекте с другими данными, полученными из другого процесса.   -  person JesusMurF    schedule 16.06.2015
comment
Вы используете UI-маршрутизатор?   -  person Joao Leal    schedule 16.06.2015
comment
@JoaoLeal Да. Я использую UI-маршрутизатор.   -  person JesusMurF    schedule 16.06.2015


Ответы (2)


Это распространенный сценарий при работе с промисами.

Вы не знаете, когда будет выполнен ваш первый запрос, поэтому, чтобы выполнить второй, вы поместили его внутрь первого (когда первый будет выполнен). Что-то вроде этого:

$http.get('http://' + ProductionConfig.SERVER + '/api/v1/business-config/').then(function (res) {
    $scope.selected= res.data;
    console.log(res.data);

    $http.get('http://' + ProductionConfig.SERVER + '/api/v1/business/id/' + res.data).then(function (res) {
        $scope.business= res.data;
        console.log($scope.business);
    }, function (err) {
        console.error('No se ha podido conseguir los datos de empresa ' + err);
    });

}, function (err) {
    console.error('No se ha podido conseguir los datos de empresa ' + err);
});

РЕДАКТИРОВАТЬ: если вам нужно что-то сделать с $scope.business, вы должны сделать это во втором вызове $http, опять же, потому что angular ничего не знает о том, когда он будет разрешен. Или вы можете создать обещание и что-то сделать, когда оно будет решено. Вам действительно нужно посмотреть, как работают обещания.

Я рекомендую вам взглянуть на это

person avcajaraville    schedule 16.06.2015
comment
Спасибо, но после этого я должен использовать данные $scope.business, чтобы присоединиться к ним в другом объекте, называемом «счет», и результат $scope.business вне метода $http.get не определен: S - person JesusMurF; 16.06.2015

С помощью ui-router вы можете указать зависимости в свойстве resolve, и это разрешит их до загрузки нового состояния.

$stateProvider.state('myState', {
      template: .... ,
      controller: .... ,
      ......
      resolve:{
         selected: function($http){
            $http.get('http://' + ProductionConfig.SERVER + '/api/v1/business-config/')
            .then(function (res) {
               console.log(res.data);
               return res.data;
             }, function (err) {
               console.error('No se ha podido conseguir los datos de empresa ' + err);
             });
         },
         business: function($http, selected){
            $http.get('http://' + ProductionConfig.SERVER + '/api/v1/business/id/' + selected)
            .then(function (res) {
                console.log(res.data);
                return res.data;
            }, function (err) {
                console.error('No se ha podido conseguir los datos de empresa ' + err);
           });
         }
       }

Затем на вашем контроллере вы можете ввести эти свойства:

angular.module('myModule').controller('MyCtrl', function(selected, business) {
   this.selected = selected;
   this.business = business;
}

or

angular.module('myModule').controller('MyCtrl', function($scope, selected, business) {
   $scope.selected = selected;
   $scope.business = business;
}
person Joao Leal    schedule 16.06.2015
comment
Да, но он не указал, что это необходимо только при первой загрузке. Это может быть внутри функции контроллера или где-то еще. - person avcajaraville; 16.06.2015
comment
Верно, я думаю, что с информацией, которую он предоставил, ваш ответ правильный. Но просто хотел показать альтернативу, которая могла бы сработать и для него. - person Joao Leal; 16.06.2015