不用ajax能完成异步请求吗,对于长时间运行的请求,AJAX请求并不是完全异步处理的...

博客讨论了一个页面中存在AJAX轮询请求每5秒触发一次,但当遇到一个需要1分钟才能完成的AJAX CRUD操作时,轮询请求会被阻塞,直到长运行请求完成。作者通过模拟长时间运行的数据库事务来重现问题,并对比了一个新建的MVC项目中正常的行为,发现现有解决方案中的请求并未完全异步处理。问题在于如何使长时间运行的请求不影响轮询请求的正常执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个包含AJAX轮询请求的页面,该请求每5秒触发一次,以及其他需要一分钟才能完成的AJAX CRUD操作。看起来发生的情况是轮询请求执行并每5秒完成一次,除非正在处理长时间运行的请求 - 在这些长时间运行的执行情况下,轮询请求的beforeSend事件将触发,但它不会触发控制器,直到长时间运行的请求已完成。轮询请求只是排队等待,直到长时间运行的请求完成,此时它将执行排队的轮询请求。对于长时间运行的请求,AJAX请求并不是完全异步处理的

我已经使用测试方法和30秒线程睡眠重新模拟了现有解决方案(下面的结果)中的场景,以模拟长时间运行的数据库事务。您会注意到,当TestSlowMethod30Seconds()开始时,TestRequest()呼叫开始排队,只有TestSlowMethod30Seconds()完成后,才会完成呼叫TestRequest()。

如果我使用基本的MVC VS模板创建一个全新的解决方案,并按照预期工作,并且长时间运行的请求对其他请求没有影响 - 它们全部都是异步处理的。

我已经花了整整一天的时间进行这项测试,我无法为我的生活制定出现有解决方案中的问题。

有没有人有任何想法?

qnkW3.png

var ajaxTest = namespace("test.ajaxTest");

ajaxTest.init = function() {

window.setInterval(function() {

ajaxTest.TestRequest();

}, 5000);

};

ajaxTest.TestRequest = function() {

$.ajax({

type: "POST",

url: "/Test/TestRequest",

beforeSend: function() {

console.log("*** TestRequest() begin");

},

complete: function() {

console.log("*** TestRequest() complete");

}

});

};

// this method is called from a button click event

ajaxTest.TestSlowMethod30Seconds = function() {

$.ajax({

type: "POST",

url: "/Test/TestSlowMethod30Seconds",

beforeSend: function() {

console.log("*** TestSlowMethod30Seconds() begin");

},

complete: function() {

console.log("*** TestSlowMethod30Seconds() complete");

}

});

};

MVC测试控制器

public ActionResult TestRequest()

{

return Json("Success");

}

public ActionResult TestSlowMethod30Seconds()

{

System.Threading.Thread.Sleep(30000);

return Json("Success");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值