使用setTimeout避开web导出文件超时

今天接到需求说需要给web前端分页加到10000,并且能导出的需求,然后想当然的改了分页,然后跑起来就报了dubbo的错

java.io.IOException: Data length too large: 8843379, max payload: 8388608, channel: NettyChannel 。。。。。

 然后找了些方法,测试后只有这种有效

<dubbo:protocol name="dubbo" port="${dubbo.port}" payload="38000000"/>

在xml配置中加入payload的设置,默认8388608是8M,再跑查询没问题了,但是导出又出现新问题,之前的导出方式前端js 

window.location.href

但是因为数据量大后台构建excel时间过长导致超时,最终通过

setTimeout(function() { window.location.href = prefix + "/exportBook"}, 1000 );

解决超时的问题,很奇怪为什么 setTimeout能解决超时问题,这货不是一个定时执行的api吗?

在MDN查了一下,了解到JavaScript 的并发模型基于“事件循环”

事件循环
之所以称之为事件循环,是因为它经常按照类似如下的方式来被实现:

while (queue.waitForMessage()) {
  queue.processNextMessage();
}
如果当前没有任何消息,queue.waitForMessage() 会同步地等待消息到达。

"执行至完成"
每一个消息完整的执行后,其它消息才会被执行。这为程序的分析提供了一些优秀的特性,包括:一个函数执行时,它永远不会被抢占,并且在其他代码运行之前完全运行(且可以修改此函数操作的数据)。这与C语言不同,例如,如果函数在线程中运行,它可能在任何位置被终止,然后在另一个线程中运行其他代码。

这个模型的一个缺点在于当一个消息需要太长时间才能处理完毕时,Web应用就无法处理用户的交互,例如点击或滚动。浏览器用“程序需要过长时间运行”的对话框来缓解这个问题。一个很好的做法是缩短消息处理,并在可能的情况下将一个消息裁剪成多个消息。

添加消息
在浏览器里,当一个事件发生且有一个事件监听器绑定在该事件上时,消息会被随时添加进队列。如果没有事件监听器,事件会丢失。所以点击一个附带点击事件处理函数的元素会添加一个消息,其它事件类似。

函数 setTimeout 接受两个参数:待加入队列的消息和一个延迟(可选,默认为 0)。这个延迟代表了消息被实际加入到队列的最小延迟时间。如果队列中没有其它消息,在这段延迟时间过去之后,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少延迟时间,而非确切的等待时间。

注意这句话 “函数 setTimeout 接受两个参数:待加入队列的消息和一个延迟(可选,默认为 0)。这个延迟代表了消息被实际加入到队列的最小延迟时间。如果队列中没有其它消息,在这段延迟时间过去之后,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完”;

通过setTimeout加入进去的动作会被加入到运行时的消息队列中,当前消息未执行完是不会处理其他消息的,也就是说他是串行的相当于检查站,必须检查完放行了当前人才会检查下一个人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值