Ответ 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'
});
})