我正在尝试将数据从JQuery Ajax发送到计算某些内容并返回结果的Generic Handler。 Ajax请求是在JQuery端的for
循环内部进行的。代码看起来像这样:
function send(Handler, ids) {
var URL = "http://" + window.location.host + "/Handlers/" + Handler + ".ashx";
var i;
for (i = 0; i < 10; i++) {
var cur = $('.' + ids[i]);
$.ajax({
url: URL,
type: "POST",
data: JSON.stringify({
Data: cur
}),
dataType: "json",
cache: false,
beforeSend: //my before send code,
success: //my success code,
error: //my error code
});
}
alert('Done!');
}
我在Visual Studio 2012中放置了3个断点:
$.ajax({
此
alert('Done!');
Generic Handler第一行的第三个断点。
现在,当我尝试执行此代码时,Ajax以异步方式很好地工作。但是,当它到达第一个断点时,停在那里然后我恢复它,而不是到达Generic Handler的断点,它继续循环并返回到第一个断点。然后在到达第二个断点后,它会一次又一次地停止在通用处理程序的断点处。
那么,这是否意味着Ajax首先收集所有ajax请求,然后在for
循环后一起执行它们?
答案 0 :(得分:2)
如果我理解正确,你刚回答了自己的问题。 Ajax异步工作意味着for循环启动并触发ajax请求,并继续循环(ajax请求不会阻止)
因此,在请求到达您的URL之前,js很可能正在执行代码循环(因为这必须创建网络调用)
那就是说,你在beforeSend方法中做了什么?也许这使得它需要足够的时间才能在发送第一个请求之前执行循环的所有迭代?
要回答你的问题,不应该等待for循环完成以发送请求,它应该在你打电话后立即启动过程
答案 1 :(得分:2)
Javascript是单线程和非阻塞的。这意味着在第一次迭代中不会等待ajax调用完成,它将返回并开始第二次迭代,依此类推。 所以,不,它不会一起执行它们。它肯定按循环的顺序启动ajax调用,但没有办法告诉什么会先结束。它可能会进行所有ajax调用,然后得到一个答案(并不意味着它是第一次迭代的答案),或者在循环中它可能会得到答案。