如何使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数据返回前面,前面可以响应并完成一些jsfunction,但是当我在urlone后台执行非常耗时的操作时,回到前面,前面没有回应。 一定有一些我没有意识到的问题,所以
您已经说过要将请求异步; 它们是(你不需要async: true
,这是默认值)。
这表明第二个请求只能在第一个请求返回后触发
不,它表明第一个在第二个之前完成 ,而不是第二个在第一个完成之前没有被触发。
如果您在重复测试中可靠地看到2 1 3
,那么它会告诉您以下两件事之一:
-
第一个请求本身比第二个请求更快 – 但是如果你持续处理
urlone
五秒钟(并且你已经validation了),那么这不是这个 -
服务器正在序列化它们
服务器可能出于以下几种原因将它们序列化; 这些原因取决于您使用的服务器端技术和配置。 例如, 某些服务器将序列化对同一“会话”中动态生成的内容的请求。
由于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"); });
这意味着只有req1和req2完成后,“console.log”内容才会运行。
或者,如果您只想打印2,3,请将其排除在外并确保在此工作后仅打印1(您说“第一个Ajax不需要完成……”) – 分配解析function在request2的解析中请求1如此( 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
只有在异步操作完成时,才会执行AJAX调用的complete
部分中的function。
您的控制台中有2 1 3
,因为AJAX调用的完成顺序不符合您的预期。 第一个AJAX调用在console.log("2")
执行完毕后完成,之后第二个AJAX调用完成。
请注意, 默认情况下 AJAX操作是异步的 。
读取: jQuery.ajax()
如果您希望控制台打印2 3 1
,您应该考虑使用promises。
读取: jQuery promise()
你的请求是异步的,顺便说一下,它们是异步的。
如果您使用node作为后端,原因可能是在单个节点的线程中睡着了。 第二个请求不能比第一个请求更快地完成,因为节点等待5秒钟响应第一个请求并且仅在该节点响应另一个请求之后。
- 401 Unauthorized通过Ajax对lalavel中的RESTful API发出DELETE请求
- 检查.ajax请求后加载的所有图像?
- 如何使用XMLHTTP将变量从JavaScript传递到PHP页面
- 有没有办法保持价值观? – 在回发中丢失了
- 当用户使用jquery在输入框上输入(使用键盘)时,如何调用ajax()
- 在jQuery UI Autocomplete中,`source`键可以保存哪些数据源?
- 使用jQuery添加XML DOM元素 – 是否可能?
- Jquery Ajax beforeSend和成功,错误和完整
- jQuery Ajax使用multipart / form-data(图像/video)提交表单元素