Многозарядные отложенные функции с использованием q в AngularJS прекращают возвращать данные
Я пытаюсь объединить несколько отложенных функций, так что следующий вызов получает результаты предыдущего отложенного. Когда я соединяю более двух этих вызовов, данные перестают возвращаться.
Вот базовый код внутри контроллера angular:
$scope.runAsync = function() {
var asyncFn1 = function(data){
var deferred = $q.defer();
$timeout(function(){
console.log("Async fn1 " + data);
$scope.outputLines.push("Async fn1 " + data);
deferred.resolve("Async fn1 " + data);
},1000);
return deferred.promise;
}
var asyncFn2 = function(data){
var deferred = $q.defer();
$timeout(function(){
console.log("Async fn2 " + data);
$scope.outputLines.push("Async fn2 " + data);
deferred.resolve("Async fn2 " + data);
},1000);
return deferred.promise;
}
asyncFn1(1)
.then(function(data){asyncFn2(data)})
.then(function(data){asyncFn2(data)})
.then(function(data){asyncFn2(data)});
}
Когда я запускаю это, я получаю следующий вывод:
Async fn1 1
Async fn2 Async fn1 1
Async fn2 undefined
Async fn2 undefined
Как я могу объединить их вместе, чтобы третий вызов получил результат от второго вызова, а четвертый получил результат от третьего?
Я создал jsFiddle: http://jsfiddle.net/rhDyL/
Ответы
Ответ 1
Выдержка из официального документа о $q:
затем (successCallback, errorCallback) - независимо от того, когда обещание был или будет разрешен или отклонен, вызывает один из успешных или ошибок обратный вызов асинхронно, как только результат будет доступен. обратные вызовы вызывают с единственным аргументом результат или отклонение причина.
Этот метод возвращает новое обещание, которое разрешено или отклонено через возвращаемое значение successCallback или errorCallback.
И для возвращаемого значения successCallack или errorCallback, в соответствии с Доменическими слайдами:
если возвращаемое значение является обещанием, тогда обещание принимает возвращенное в противном случае вызов обратного вызова сразу же называется с возвращаемым значением
В соответствии с определением в вашем коде отсутствует ключевое слово return
. Он должен быть следующим:
asyncFn1(1)
.then(function(data){return asyncFn2(data)})
.then(function(data){return asyncFn2(data)})
.then(function(data){return asyncFn2(data)});