我们正在尝试以特定顺序执行许多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() });