到目前为止,我做到了这一点:
$.when(Results.ServiceController.Ajax1(clickedNumber))
.then(Results.UtilFunctions.Wait(5000))
.then(Results.ServiceController.Ajax2(clickedNumber));
我的Ajax1函数返回ajax对象。我的等待功能如下所示:
function (time) {
var ret = new $.Deferred();
setTimeout(function () {
ret.resolve();
}, time);
return ret;
}
问题是第二个ajax请求功能(Ajax2)没有等待Wait功能! 编辑: 我也尝试过:
$.when(Results.ServiceController.Ajax1(clickedNumber),Results.UtilFunctions.Wait(5000))
.then(Results.ServiceController.Ajax2(clickedNumber));
并没有改变。 来自jQuery文档:
"在多个Deferred对象传递给jQuery.when的情况下,该方法从一个新的" master"返回Promise。延迟对象,用于跟踪已传递的所有Deferred的聚合状态。一旦所有延期解决方案解决,该方法将解决其主延期,或者在其中一个延期被拒绝后立即拒绝主延期。如果解析了主Deferred,则传递传递给jQuery的所有Deferred的已解析值。例如,当Deferreds是jQuery.ajax()请求时,参数将是请求的jqXHR对象,按照它们在参数列表中给出的顺序。"
答案 0 :(得分:1)
setTimeout(...)
总是立即返回,并且在超时到期后执行第一个参数传递的函数。
您应该执行以下操作:
function (f, arg, time) {
setTimeout(function () {
f(arg);
}, time);
}
$.when(Results.ServiceController.Ajax1(clickedNumber))
.then(Results.UtilFunctions.Wait(
Results.ServiceController.Ajax2, clickedNumber, 5000
));
代替。
答案 1 :(得分:0)
Ajax-Functions默认是异步的。
解决方案1是:制作同步功能。和jQuery一样:
$.ajax(
url: ".../foo",
async: false
)
$.ajax(
url: ".../bar",
async: false
)
解决方案2是:在第一个函数调用的success-callback中执行第二个ajax-function-call。和jQuery一样:
$.ajax(
url: "...",
success: function (data) {
anotherAjaxFunction()
}
)
答案 2 :(得分:0)
不确定为什么它不适合你。 See this fiddle for a simple demonstration
function wait(time) {
var ret = new $.Deferred();
setTimeout(function() {
ret.resolve('resolved in ' + time);
},time);
return ret;
}
function ajaxCallOnWait() {
$.each(arguments, function(index, res) {
$('ul').append('<li>' + res + '</li>');
});
}
var promise = $.when(wait(1000), wait(5000), wait(2000));
promise.then(ajaxCallOnWait);
它等待总共8秒,$.when
返回延迟,在这个延迟时我只是做一个然后调用另一个函数。这可以是ajax调用,也可以是我样本中的简单追加。