如何使ajax请求异步?

时间:2015-02-04 09:31:58

标签: javascript jquery ajax

我想让一些ajax请求异步。  比如两个Ajax,第一个Ajax不需要完成,第二个请求可以发生,

$.ajax({
            url: "urlone",
            async: true, 
              complete: function () {
                console.log("1");
            }, 
            type: "post",
           dataType: "json"
        });


 console.log("2");

 $.ajax({
            url: "urltwo",
            async: true,
              complete: function () {
                console.log("3");
            },
             type: "post", 
             dataType: "json"
});

在urlone背景中,我让线程睡了5秒钟, 在urltwo背景中,我立即返回json。

我写这个,但没有效果, 我想要控制台打印 2 3 1

但是,实际上,它打印 2 1 3

这显示第二个请求只能在第一个请求返回后触发

如何解决这个问题??

2月6日补充:感谢您的热情回答。 我的服务器端是C# 并在urlone 我写了

JsonModel  xx=new JsonModel(){.......};   //as you known
System.Threading.Thread.Sleep(5000);
return Json(xx);
在urltwo中 我写了

JsonModel  xx=new JsonModel(){.......};   //as you known
return Json(xx);

就是这样!

我想要这个,因为我在urlone中执行了非常耗时的操作, 当我从urlone回来时,前面已经失去了响应,即使我设置了一个非常大的ajax等待时间。所以我想查询urlone中的操作是否由请求urltwo完成,urltwo是为查询数据库完成字段标志而设计的用于urlone中的操作。 这是我的想法。

但今天,我发现了一个新问题。 当我长时间睡眠后台线程,然后将json数据返回前面,前面可以响应并完成一些js功能,但是当我在urlone后台执行非常耗时的操作时,当它返回前面时,前面没有响应。 一定有一些我没有意识到的问题, 所以

4 个答案:

答案 0 :(得分:4)

你说你想让请求异步;他们是(你不需要async: true,这是默认的。)

  

这显示第二个请求只能在第一个请求返回后触发

不,它显示第一个在第二个之前完成,而不是第二个在第一个完成之前没有被触发。

如果您在重复测试中可靠地看到2 1 3,则会告诉您以下两项内容之一:

  1. 第一个请求的处理速度肯定比第二个要快 - 但是如果你持续处理urlone五秒钟(而且你已经验证了那个),那不是这个

  2. 服务器正在序列化

  3. 服务器可能出于以下几种原因将其序列化;这些原因取决于您使用的服务器端技术和配置。例如,某些服务器将序列化对同一“会话”中动态生成内容的请求。

答案 1 :(得分:0)

由于async和你发布的代码的性质,这些请求你永远无法保证一个人会在另一个之前完成(考虑一个真实世界的例子,其中req1正在等待req2想要的资源,它可能会阻止req2从完成)。

如果您的最终目标是控制执行流程然后获得对流量的一些控制,您可以利用jQuery AJAX的延迟(或基于承诺)性质(jsFiddle http://jsfiddle.net/2qjha4m7/):

var req1 = $.ajax({
            url: "urlone",  
            type: "post",
           dataType: "json"
        });

 var req2 = $.ajax({
            url: "urltwo",
             type: "post", 
             dataType: "json"
});

$.when(req1, req2).done(function(resultFromReq1, resultFromReq2) {
    console.log("2");
    console.log("3");
    console.log("1");
});

这意味着" console.log"东西只会运行一次req1& req2已经完成。

或者,如果您只想打印2,3,请将其排除在外并确保在此工作后仅打印1(您说"第一个Ajax不需要完成。 .." - 在request2的分辨率内为request1分配一个分辨率函数,如此(http://jsfiddle.net/Lf5axetd/):

var req1 = $.ajax({
            url: "urlone",   
            type: "post",
           dataType: "json"
        });

 var req2 = $.ajax({
            url: "urltwo",
             type: "post", 
             dataType: "json"
});

req2.done(function(result) {
   console.log("2");
   console.log("3");
   req1.done(function(resultFromReq1) {
       alert("1"); 
   });
});

而且,是的,就像其他人说的那样,这些东西默认是异步的,不需要异步:true

答案 2 :(得分:-1)

只有在执行异步操作时,才会执行AJAX调用的complete部分中的函数。

您的控制台中有2 1 3,因为AJAX调用的完成顺序与您的预期不符。第一个AJAX调用在执行console.log("2")之后完成,之后第二个AJAX调用完成。

请注意,AJAX操作默认为异步

读取: jQuery.ajax()


如果您希望控制台打印2 3 1,您应该考虑使用promises。

读取:jQuery promise()

答案 3 :(得分:-1)

您的请求是异步的,顺便说一句,默认情况下它们是异步的。

如果您使用node作为后端,原因可能是单个节点的线程进入睡眠状态。第二个请求无法比第一个请求更快地完成,因为节点等待5秒钟响应第一个请求并且仅在该节点响应另一个请求之后。