Многозарядные отложенные функции с использованием 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)});