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

Ожидание обещания?

У меня есть следующий код:

$scope.clients = commonFactory.getData(clientFactory.getClients());
if ($scope.clients.length > 0) {
    $scope.sampleForm.ClientId = $scope.clients[0].ClientId;
}

И функция getData в commonFactory:

factory.getData = function (method) {
    method.then(function (response) {
        return response.data;
    }, function (error) {
        $rootScope.alerts.push({ type: 'error', msg: error.data.ExceptionMessage });
    });
};

Проблема заключается в том, что $scope.clients.length является undefined, когда он удаляет эту строку из-за асинхронного вызова.

Есть ли способ не выполнять проверку длины до тех пор, пока я не узнаю, что присвоено значение $scope.clients? Я посмотрел на что-то вроде этого:

$scope.clients = commonFactory.getData(clientFactory.getClients()).then(function () {
    if ($scope.clients.length > 0) {
        $scope.sampleForm.ClientId = $scope.clients[0].ClientId;
    }
});

Попытка связать мой then promises, но без кубиков... Цель здесь заключается в том, чтобы метод getData избегал кучи кода шаблона для улавливания ошибок... возможно, я собираюсь сделать это неправильно

4b9b3361

Ответ 1

Это самая основная ситуация, для которой promises. Вам просто нужно выполнить обещание var deferred = $q.defer() при начале операции async, разрешить обещание с помощью deferred.resolve(result), когда операция async будет завершена, и вернуть deferred.promise в вашу функцию. Angular асинхронные методы делают это внутренне и возвращают promises уже, поэтому вы можете просто вернуть те же promises, а не создавать новые promises с помощью $q.defer(). Вы можете прикрепить .then ко всему, что возвращает обещание. Кроме того, если вы вернете значение из функции then, это значение будет завернуто в обещание, так что цепочка then может продолжить

angular.module('myApp', [])

.factory('myService', function($q, $timeout, $http) {
  return {
    myMethod: function() {
      // return the same promise that $http.get returns
      return $http.get('some/url');
    }
  };
})

.controller('myCtrl', function($scope, myService) {
  myService.myMethod().then(function(resp) {
    $scope.result = resp.data;
  });
})

И вот немного интереснее цепочки:

.factory('myService', function($q, $timeout, $http) {
  return {
    myMethod: function() {
      // return the same promise that $http.get returns
      return $http.get('some/url').then(function() {
        return 'abc';
      });
    }
  };
})

.controller('myCtrl', function($scope, myService) {
  myService.myMethod().then(function(result) {
    console.log(result); // 'abc'
    return someOtherAsyncFunc(); // for example, say this returns '123'
  }).then(function(result) {
    console.log(result); // '123'
  });
})