1

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

这是我用于请求的代码:

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

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

4

4 回答 4

3

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

例如,假设您有一个类似的容器<div id="container"></div>,您可以执行以下操作:

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

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

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

于 2012-04-12T00:59:02.537 回答
1

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

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

于 2012-04-12T01:03:36.903 回答
0

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

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+"<br>");
   }
}

setTimeout(100, loadAnswers);

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

于 2012-04-12T01:04:07.060 回答
0

将成功函数从 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+"<br>");
    SecondOne.done(function(data){
        $('p').append(data+"<br>");
    }); 
}); 

对于更高级的方法,学习Promise的工作原理是个好主意!

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

于 2012-04-12T01:30:43.277 回答