为什么最后一个链接的“.then”在之前链接的函数之前被评估?

时间:2015-02-14 23:02:35

标签: angularjs angular-promise

我在Angular中设置了一个简单的$q系统。

控制器只包括:

     var fun1 = function(){
        var deferred = $q.defer();

        $timeout(function(){
            console.log("fun1 resolving...");
            deferred.resolve(5);
        }, 1000);


        return deferred.promise;
    }
    var fun2 = function(){
        var deferred = $q.defer();

        $timeout(function(){
            console.log("fun2 resolving...");
            deferred.resolve(6);
        }, 1000);

        return deferred.promise;
    }
    var promise = fun1().then(fun2()).then(function(data){
        console.log(data);
    });

我希望打印出来:

fun1 resolving....
fun2 resolving....
5

但是打印出

fun1 resolving....
5
fun2 resolving....

这对我来说很奇怪。为什么最后一个链式console.log的{​​{1}}在实际.then()之前进行评估?

2 个答案:

答案 0 :(得分:2)

这不是因为您正在调用fun2,而不是仅仅将其传递到then吗?

就像:

var promise = fun1().then(fun2).then(function(data){
    console.log(data);
});

但结果将是:

fun1 resolving....
fun2 resolving....
6

而不是输出5,因为fun2会将6(deferred.resolve(6);)传递给您的上一次回调。

答案 1 :(得分:1)

因为您正在执行fun2()而不是将fun2作为函数提供:

var promise = fun1().then(fun2).then(function(data){
    console.log(data);
});

then需要一个返回promise的函数。