如何按请求的顺序处理jquery ajax请求

我正在创建一个java servlet页面,它检查域名列表,并通过jquery ajax请求检查每个域名。 它工作正常,除了结果不按顺序附加到DOM。 在请求的顺序中处理请求的最佳方法是什么,但也像长轮询效果一样异步。 我是javascript的新手。

这是我用于请求的代码:

$.ajax({ async:true, type:'GET', url:servlet, success:function(data){ $('p').append(data+"
"); }, });

我正在考虑向java servlet发送一个序列号,它将通过JSON返回它,但我想知道是否有更简单的方法。

我要做的是提前为响应创建容器,然后绑定它周围的回调(实际上不像bind()函数那样绑定)。

例如,假设您有一个类似

,您可以执行以下操作:

 function makeRequest(something) { var target = $("
"); $("#container").append(target); $.get("", {something: something}, function(data) { target.html(data); }); }

就灵活性而言,这是一个相当糟糕的例子,但它应该说明这一点。 它在发出请求之前向容器添加div,然后使用该div将响应推送到。 这意味着div将按请求的顺序附加。 你可以扩展这个想法,使用样式使它看起来像div在它们填充之前不存在,或者你可以在其中有“加载”消息。

(另外,使用something参数传递数据相当糟糕,但希望你明白这一点。)

我猜你的问题是浏览器向服务器发送尽可能多的AJAX请求,服务器尽可能地回答它们。 服务器可能只是比其他服务器更快地回答,所以尽管请求是按顺序发送的,但是它们会使它们无序。

解决此问题的方法是按顺序发送查询以确保回复顺序。 从本质上讲,做一个AJAX调用,并且在该调用成功后,然后启动第二个AJAX调用,等等……

您可以对发送到服务器的请求进行排序,缓存结果,并仅按顺序添加它们

 next_to_request = 0; next_to_append = 0; results = []; function reqToServer(){ var e = next_to_request++; $.ajax({ async:true, type:'GET', url:servlet, success:function(data){ results[e] = data; }, }); function loadAnswers(){ if (results[next_to_request]){ data = results[next_to_request]; next_to_request++; $('p').append(data+"
"); } } setTimeout(100, loadAnswers);

这具有用于显示结果的不同线程,并且仅以正确的顺序显示。

从Ajax函数本身获取成功函数,并链接成功函数,它们将按顺序触发,如果一个请求尚未完成,它将等待它完成,然后再触发下一个请求。

一个非常简单的方法是这样做:

 var firstOne = $.ajax({ async:true, type:'GET', url:servlet }); var SecondOne = $.ajax({ async:true, type:'GET', url:servlet }); firstOne.done(function(data){ $('p').append(data+"
"); SecondOne.done(function(data){ $('p').append(data+"
"); }); });

对于更高级的方法,学习如何工作是一个好主意!

这比顺序发送ajax请求要快得多,等待最后一个请求在下一个请求开始之前完成,因为这将在浏览器可用时发送所有这些请求,并且链接done()函数将等待任何不是完成后,只需按照您输入的顺序执行完成后立即完成的内容,然后按正确的顺序添加内容。 如果使用promises和$ .when / $进行许多ajax调用,那么将允许您使用迭代等构建更合理的函数。