32

我正在尝试将多个延迟函数调用链接在一起,以便下一个调用获得前一个 deferred.resolve 的结果。当我将这些调用中的两个以上链接在一起时,数据将停止返回。

这是角度控制器内的基本代码:

    $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/

4

1 回答 1

40

摘自关于 $q 的官方文档:

then(successCallback, errorCallback) – 无论承诺何时被解决或将被解决或被拒绝,只要结果可用,就会异步调用成功或错误回调之一。使用结果或拒绝原因的单个参数调用回调。

此方法返回一个新的 Promise,该 Promise 通过 successCallback 或 errorCallback 的返回值解决或拒绝。

而对于 successCallack 或 errorCallback 的返回值,根据Domenic 的幻灯片

如果返回值是一个 Promise,则该 Promise 采用返回的 Promise 的状态,否则立即使用返回值调用成功回调

根据定义,您的代码缺少return关键字。它应该如下所示:

    asyncFn1(1)
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)});
于 2013-04-18T02:31:41.417 回答