在AngularJS中使用q的多个链式延迟函数停止返回数据

Box*_*cks 32 angularjs q

我试图将多个延迟函数调用链接在一起,以便下一个调用获取前一个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)});
    }
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下输出:

Async fn1 1
Async fn2 Async fn1 1
Async fn2 undefined
Async fn2 undefined
Run Code Online (Sandbox Code Playgroud)

如何将它们链接在一起,以便第三个调用从第二个调用获得结果,第四个调用从第三个调用获得结果?

我创建了一个jsFiddle:http://jsfiddle.net/rhDyL/

tam*_*are 40

摘录自$ q的官方文档:

然后(successCallback,errorCallback) - 无论何时或将要解决或拒绝承诺,只要结果可用,就会异步调用其中一个成功或错误回调.使用单个参数调用回调结果或拒绝原因.

此方法返回一个新的promise,它通过successCallback或errorCallback的返回值解析或拒绝.

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

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

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

    asyncFn1(1)
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)});
Run Code Online (Sandbox Code Playgroud)

  • 不久前我自己处于相同的位置._Promise&deferred_确实需要一些学习曲线和练习来习惯.不过,我认为这是值得的.它使得在异步编程世界中管理代码执行变得更加容易.如果你还不熟悉这个话题,我强烈推荐[本读物](http://www.slideshare.net/domenicdenicola/promises-promises). (2认同)