web 下如何处理对时间消耗较长的查询呢

2016-01-27 22:53:07 +08:00
 supman

有一比较耗时间的查询 怎么才能做到 用户提交查询后 直接返回一个”开始查询的提示” 等真正查询结果出来 再进行提示呢?

1628 次点击
所在节点    问与答
7 条回复
randyzhao
2016-01-27 22:55:15 +08:00
难道最简单的不就是 Ajax 么.
supman
2016-01-27 22:57:45 +08:00
@randyzhao 谢啦 之前一直以为 ajax 是用来刷新的
supman
2016-01-27 23:12:26 +08:00
还是不大明白。。。
Midnight
2016-01-27 23:13:05 +08:00
前后端都异步
yeyeye
2016-01-28 00:10:21 +08:00
1 楼的方式应该是这样
查询按钮一点击下去,马上蹦出一个提示,正在查询,然后通过 ajax 去获取这个很慢的数据,获取到之后去掉提示,展示数据,这样的话有一个缺点,有一个请求一直卡在那里

这个问题我在很久很久很久之前就考虑过
我说一个可行的方式(全程用 ajax )

1.客户端查询的直接展示一个查询中的提示,然候伴随发送一个随机字符串,作为这次查询的依据,请求发送成功后,直接断掉这个连接
2.服务器收到这个随机字符串,放到数据库里,并标记状态为正在处理,然后进行查询,忽略掉前端终止页面而停止脚本,查询完成后把数据存入这个数据库的相同标记里,把状态字段改为查询成功,如有故障无法完成,则标记状态为故障
3.客户端在之前做了断开操作后,开始每 N 秒向服务器发起查询,查询数据库里的标记(附带上前面的那个随机字符串)。若完成则返回结果展示给用户

1.可能不知道如何断开一个连接,我也不知道怎么断,如果前台不会就用后台实现吧, WP 就是这样执行 cron 的,发送一个请求到 cron 页面,然后直接断掉,让它异步的慢慢处理,不再管了,人家是开源的,你自己去看。

2.可以选择发送随机字符串作为查询凭证,也可以由服务器发放一个 ID 给客户端作为凭证

3.这个没什么技术含量了
hxsf
2016-01-28 00:56:51 +08:00
@yeyeye 这样的话本来收到请求-执行-返回,就变成收到请求-返回-写库-执行-写库-接受轮询-返回结果,期间还要响应轮询。。。

话说 b/s 的话如果有长处理的话,尽量优化逻辑,化整为零,把计算量分摊到平时。
实在优化不行就用 websocket 通信吧。。。
ArthurKing
2016-01-28 09:13:56 +08:00
前台提交任务,任务提交入库或者入队列,然后后台开个线程池专门处理。处理完毕后写状态,前台只管轮询状态等待处理完成后显示结果即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX