Pregunta Múltiples funciones diferidas encadenadas que usan q en AngularJS dejan de devolver datos


Estoy intentando encadenar varias llamadas a funciones diferidas de modo que la próxima llamada obtenga los resultados de la resolución diferida anterior. Cuando encadenar más de 2 de estas llamadas, los datos dejan de ser devueltos.

Aquí está el código básico dentro de un controlador 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)});
    }

Cuando ejecuto esto obtengo el siguiente resultado:

Async fn1 1
Async fn2 Async fn1 1
Async fn2 undefined
Async fn2 undefined

¿Cómo puedo encadenarlos para que la tercera llamada obtenga el resultado de la segunda llamada y la cuarta obtenga el resultado de la tercera?

He creado un jsFiddle: http://jsfiddle.net/rhDyL/


32
2018-04-17 22:48


origen


Respuestas:


Extracto tomado del documento oficial sobre $ q:

then (successCallback, errorCallback) - independientemente de cuándo la promesa   fue o será resuelto o rechazado llama uno de los éxitos o errores   devoluciones de llamada asincrónicamente tan pronto como el resultado esté disponible. los   las devoluciones de llamada se llaman con un solo argumento el resultado o rechazo   razón.

Este método devuelve una nueva promesa que es resuelto o rechazado a través de   el valor de retorno de successCallback o errorCallback.

Y para el valor de retorno del successCallack o errorCallback, de acuerdo con Diapositivas de Domenic:

si el valor de retorno es una promesa, entonces la promesa adopta el retorno   estado de la promesa de lo contrario la devolución de llamada de éxito se llama inmediatamente   con el valor de retorno

Según la definición, a su código le falta el return palabra clave. Debería ser el siguiente:

    asyncFn1(1)
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)});

40
2018-04-18 02:31