我们正在尝试以特定顺序执行许多AJAX调用。以下代码包含methodA,methodB和methodC(每个返回运行async = true的AJAX Promise对象)。

它们使用jQuery中的then()函数链接在一起。

 self.methodA().then( self.methodB() ).then( self.methodC() )


我已将其中一种方法设为慢速(methodB)(我使用了慢速URL)。

我希望A ...等待10秒...然后B然后C.

相反,我得到A,C .... 10秒等待和B。

为什么这样做呢?在always()函数中使用alert()与我有什么关系吗?

这是我的小提琴代码:
http://jsfiddle.net/h8tfrvy4/13/

码:

function Tester() {
    var self = this;
    this.url = 'https://public.opencpu.org/ocpu/library/';
    this.slowurl = 'http://fake-response.appspot.com/?sleep=5';


    this.save = function() {
        self.methodA().then( self.methodB() ).then( self.methodC() )
    }

    this.methodA = function () {
        var self = this;

        return $.ajax({
            url: self.url,
            async: true
        }).always(function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

            //check for errors... and if OK
            alert('A OK');


        })
    }
    this.methodB = function () {
        var self = this;

        return $.ajax({
            url: self.slowurl,
            async: true
        }).always(function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

            //check for errors... and if OK
            alert('B OK');


        })
    }
    this.methodC = function () {
        var self = this;

        return $.ajax({
            url: self.url,
            async: true
        }).always(function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {
            //OK
            alert('C OK');

        })
    }
}
new Tester().save();

最佳答案

这是错误的:

self.methodA().then( self.methodB() ).then( self.methodC() )


您正在立即调用每种方法,并将promise传递给then

如果希望每个函数等到前一个函数完成,则需要给每个then一个回调,以在前一个诺言解决时执行:

self.methodA().then(function () { return self.methodB() }).then(function() { return self.methodC() });

10-07 16:22
查看更多