簡體   English   中英

承諾鏈(角度javascript)

[英]Promise chaining (angular javascript)

因此,我有一些函數可以對服務進行異步調用。 我不希望它們全部在上一個完成之后執行,但前提是前一個沒有失敗。 看起來像這樣:

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
                    }
                });
            }
        });
    }
});

如果將更多功能添加到此鏈中,最后的執行就很糟糕。 我不知道是否還有另一種方式可以構造這種方式,使其行為相同,但不會創建巨大的鏈式異步調用樹。 如果我能保持相同的縮進,那將是很好的。 謝謝!

您必須修改錯誤回調以返回$q.reject()而不是false ,即:

var fn1 = function() {
    var promise = aService.fn1();
    var successCallback = function(response) {
        // no return needed, unless the next stage
        // requires the results of this stage
    };
    var errorCallback = function() {
        return $q.reject();
    };
    return promise.then(successCallback, errorCallback);
};

鏈接變為:

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

實際上,您甚至不必在f1f2f3編寫該痛苦的代碼,即以下代碼也可以完成此工作:

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

如果您已經確定了服務功能,則可以將其簡短化:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM