如何使 AJAX 请求异步
how to make ajax request async?
我想异步制作一些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。
我写这个,但没有效果,我想要控制台打印231
但是,实际上,它打印213
这显示第二个请求只有在第一个请求返回后才能被触发
如何解决这个问题??
2月6日新增:感谢您热情的回答。我的服务器端是 C#和在乌隆我写了
JsonModel xx=new JsonModel(){.......}; //as you known
System.Threading.Thread.Sleep(5000);
return Json(xx);
在网址二我写了
JsonModel xx=new JsonModel(){.......}; //as you known
return Json(xx);
就是这样!
我想要这个,因为我在 urlone 中执行了一个非常耗时的操作,当我从urlone回来的时候,前面已经失去了响应,即使我设置了非常大的ajax等待时间。所以我想查询urlone中的操作是否由请求urltwo完成,urltwo是为urlone中的操作设计的查询数据库完整字段标志。这是我的想法。
但是今天发现了一个新问题。当我长时间休眠后台线程时,然后将json数据返回到前面,前面可以响应并完成一些js功能,但是当我在urlone后台执行非常耗时的操作时,当它返回前面时,前面没有响应。一定有什么问题我没有意识到,所以
你说过要使请求异步;它们是(你不需要async: true
,这是默认值)。
这显示第二个请求只有在第一个请求返回后才能被触发
不,它表明第一个在第二个之前完成,而不是第二个直到第一个完成才触发。
如果您在重复测试中可靠地看到2 1 3
,则告诉您以下两件事之一:
- 第一个请求的处理
速度本质上比第二个 请求快——但如果你将
urlone
的处理时间推迟了五秒钟(并且你已经验证了这一点),那么它就不是这个服务器正在序列化它们
可能出于多种原因中的任何一种对其进行序列化;这些原因取决于您使用的服务器端技术和配置。例如,某些服务器将序列化对同一"会话"中动态生成内容的请求。
由于异步的性质和您发布的代码,您永远无法真正保证其中一个请求会在另一个请求之前完成(考虑一个真实世界的示例,其中 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");
});
这意味着"控制台.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
AJAX 调用complete
部分中的函数仅在异步操作完成后执行。
您在控制台中获得了2 1 3
,因为 AJAX 调用的完成顺序不是您所期望的。第一个 AJAX 调用在执行console.log("2")
后完成,之后第二个 AJAX 调用完成。
请注意,默认情况下,AJAX 操作是异步的。
Readup: jQuery.ajax()
如果您希望控制台打印2 3 1
,则应考虑使用promises。
Readup: jQuery promise()
您的请求是异步的,顺便说一句,默认情况下它们是异步的。
如果使用节点作为后端,原因可能是单个节点的线程睡着了。第二个请求的完成速度不能比第一个请求快,因为节点等待 5 秒才能响应第一个请求,并且仅在该节点响应另一个请求之后。
- 如果需要登录,Angularjs$http拦截器会暂停异步请求
- RxJS异步请求更新
- Node js中间件,用于向mongo发出异步请求
- AJAX-如何在不冻结浏览器的情况下逐个发出异步请求
- 如何等待异步请求完成
- 为什么Chrome似乎异步请求Javascript文件
- 使用异步请求多个网址
- 在HTML中,可以在没有Ajax和/或Javascript的情况下创建异步请求
- 节点 JS 使用异步请求同步工作流
- 如何处理客户端节点上的异步请求
- 具有异步请求的 NodeJS
- 使用请求-承诺的嵌套异步请求
- 将数据从异步请求添加到 WebSQL 数据库时出错
- 使用 Jasmine 测试触发异步请求的方法
- 状态 = 0 的异步请求
- 在 Node.js 服务器内发出异步请求错误:“类型错误:对象 #<对象> 没有方法'_implicitHeader'”
- 如何使用 jquery ajax 向 PHP 页面发送异步请求
- 承诺解析错过异步请求循环的一个值
- 用于处理成功、失败、重试的异步请求的设计模式?(JavaScript)
- 如何处理对循环中发出的多个异步请求(AJAX 调用)的响应