承诺链(角度javascript)

承诺链(角度javascript),javascript,angularjs,asynchronous,promise,chaining,Javascript,Angularjs,Asynchronous,Promise,Chaining,因此,我有几个函数都可以对服务进行异步调用。我不希望在前一个完成后执行所有这些,但前提是前一个没有失败。它看起来像这样: var fn1 = function() { var promise = aService.fn1(); var successCallback = function(response) { return true; }; var errorCallback = function() { return false

因此,我有几个函数都可以对服务进行异步调用。我不希望在前一个完成后执行所有这些,但前提是前一个没有失败。它看起来像这样:

var fn1 = function() {
    var promise = aService.fn1();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};
var fn2 = function() {
    var promise = aService.fn2();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};
var fn3 = function() {
    var promise = aService.fn3();
    var successCallback = function(response) {
        return true;
    };
    var errorCallback = function() {
        return false;
    };
    return promise.then(successCallback, errorCallback);
};

fn1().then(function(resp){
    if (resp)
    {
        fn2().then(function(resp){
            if (resp)
            {
                fn3().then(function(resp){
                    if (resp)
                    {
                        // all functions have been called in order were successful
                    }
                });
            }
        });
    }
});

当更多的函数被添加到这个链中时,最后的执行看起来非常糟糕。我不知道是否有其他方法可以将其结构化,使其行为相同,但不会创建一个巨大的链式异步调用树。如果我能把它保持在相同的凹痕上,那就太好了。谢谢大家!

如果您的服务功能已经实现,那么您可以将事情做得非常简短:

aService.fn1()
.then(aService.fn2.bind(aService))
.then(aService.fn3.bind(aService))
.then(function(){
    // all functions have been called in order and were successful
});

如果您的服务功能已经得到承诺,您可以将事情保持得非常简短:

aService.fn1()
.then(aService.fn2.bind(aService))
.then(aService.fn3.bind(aService))
.then(function(){
    // all functions have been called in order and were successful
});

您必须修改错误回调以返回$q.reject而不是false,即:

链接将变为:

fn1()
    .then(function() {
        return fn2();
    })
    .then(function() {
        return fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });
事实上,您甚至不必在f1、f2、f3中编写痛苦的代码,即以下代码也可以完成此工作:

aService.fn1()
    .then(function() {
        return aService.fn2();
    })
    .then(function() {
        return aService.fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });

您必须修改错误回调以返回$q.reject而不是false,即:

链接将变为:

fn1()
    .then(function() {
        return fn2();
    })
    .then(function() {
        return fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });
事实上,您甚至不必在f1、f2、f3中编写痛苦的代码,即以下代码也可以完成此工作:

aService.fn1()
    .then(function() {
        return aService.fn2();
    })
    .then(function() {
        return aService.fn3();
    })
    .then(function() {
        // ALL SUCCEEDED HERE
    });

非常感谢。这非常有效。我不能使用您的第三个解决方案,尽管在我的实际代码中,我在fn1、fn2和fn3的错误和成功回调中有一些逻辑。然而,您提供的第二个解决方案正是我所要寻找的。@martingo89见,谢谢!这非常有效。我不能使用您的第三个解决方案,尽管在我的实际代码中,我在fn1、fn2和fn3的错误和成功回调中有一些逻辑。然而,您提供的第二个解决方案正是我所要寻找的。@martingo89请参见