V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
supman
V2EX  ›  问与答

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

  •  
  •   supman · 2016-01-27 22:53:07 +08:00 via iPad · 1672 次点击
    这是一个创建于 3224 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    话说 b/s 的话如果有长处理的话,尽量优化逻辑,化整为零,把计算量分摊到平时。
    实在优化不行就用 websocket 通信吧。。。
    ArthurKing
        7
    ArthurKing  
       2016-01-28 09:13:56 +08:00
    前台提交任务,任务提交入库或者入队列,然后后台开个线程池专门处理。处理完毕后写状态,前台只管轮询状态等待处理完成后显示结果即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:53 · PVG 02:53 · LAX 10:53 · JFK 13:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.