V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Corbusier
V2EX  ›  程序员

请教一个关于 js 异步/同步流程的问题

  •  
  •   Corbusier · 2017-11-13 13:40:32 +08:00 · 1711 次点击
    这是一个创建于 2554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    流程是这样的:

    1.异步请求
    2.同步判断
    

    需求:先是判断是否为敏感词的 ajax 异步请求,且该请求的优先级高于第二个同步的判断,即输入内容如果是敏感词,则不需要进入 2 中的同步判断。

    现状:如果保持这样的流程就会使前端展示混乱,考虑的解决方式有:

    解决思路 1:

    将 1 的异步请求变为同步,但是这样也同样会影响用户体验。

    解决思路 2:

    将 2 的同步放在 setTimeout 的进程中变为异步,使用 async/await 异步请求 2 个判断。但是做感觉这样有点小题大做了,而且私以为也不是什么特别好的方法。

    有没有更好的解决方法,请大家指教!

    11 条回复    2017-11-14 10:03:13 +08:00
    fds
        1
    fds  
       2017-11-13 14:28:50 +08:00
    没懂,异步请求回来再同步判断会有什么问题?
    过程中前端应该保持“等待服务器结果”的状态。

    能用 await 的话代码更简单了。await 1 然后同步 2 呗……
    Corbusier
        2
    Corbusier  
    OP
       2017-11-13 14:34:39 +08:00
    @fds 你好,我的意思是这两个请求是没有请求结果关联依赖的,比如说第一个请求得到的结果是敏感词需要对应展示,同步中的判断,如:是否为特殊字符,长度限制等,也对应了相应的展示。而如果保持这样的 1.同步 2.异步就会导致前端页面展示混乱。现在我表达意思清晰了吗?
    yongjing
        3
    yongjing  
       2017-11-13 14:54:18 +08:00
    2 依赖于 1 的返回结果,所以我 “不感觉这样有点小题大做”
    meszyouh
        4
    meszyouh  
       2017-11-13 14:59:13 +08:00
    没觉得哪里混乱了 , 异步的判断优先于同步的判断 , 后端判断是敏感 就提示敏感 , 否则在同步判断 , 然后再显示
    Corbusier
        5
    Corbusier  
    OP
       2017-11-13 15:21:43 +08:00
    @meszyouh 你的理解没有错,但是问题的关键还是在于异步 /同步的执行顺序问题。同步的前端展示已经有了,而第一步的异步才刚拿到结果,这样就会马上修改已有的前端展示。所以我的想法是在于把异步请求变为同步,或者是同步请求放在另一个线程里强行的变为异步,然后 async/await。不知道我表达的有没有问题
    whypool
        6
    whypool  
       2017-11-13 15:27:39 +08:00
    流程就不对,哪有那么纠结,还同步,神经病啊;
    输入框 1->输入状态->失去焦点,把内容发 ajax 判断,等待返回结果,记录验证是否通过;
    输入框 2->输入状态->失去焦点,把内容发 ajax 判断,等待返回结果,记录验证是否通过;

    由于失去焦点就发 ajax,反复操作容易卡服务器,还容易阻塞,可以加个按钮什么的,让用户主动去触发校验(产品的锅);
    或者等用户全部输入完成了一起发 ajax 校验,判断一下返回就行了
    meszyouh
        7
    meszyouh  
       2017-11-13 15:45:49 +08:00
    @Corbusier 什么叫 同步的前端展示已经有了, 难道不是 判断, 显示 loading , 再把结果呈现给用户?看你的描述 触发一个事件 先执行同步的判断 ...
    fds
        8
    fds  
       2017-11-13 15:48:15 +08:00
    @Corbusier 这其实是两个状态,不应该互相干扰的。前端展示应该同时判断两个状态。
    两个状态:
    敏感:可能取值:等待验证结果、有敏感词、没问题
    其他:可能取值:没问题、超长、特殊字符
    一个前端展示函数:
    敏感为有敏感词,显示为有敏感词。
    敏感为等待验证结果,显示为等待中。
    敏感为没问题,根据“其他”的状态显示。
    输入完或异步回调完都调用展示函数即可。

    不过我没明白为什么同步的判断优先级要比敏感词低。按理说应该是先通过了同步判断再进行 ajax 验证的。
    Corbusier
        9
    Corbusier  
    OP
       2017-11-13 18:51:36 +08:00
    @fds 感谢回复!如果按照先同步判断再进行 ajax 验证,展示结果提示:超长||特殊字符,用户继续输入敏感词,异步返回敏感词提示。这样不就是涉及到了展示混乱的问题了吗?请求过程取反结果亦然。不过这和我的事件绑定也有关系,我的表单验证绑定的是"input"事件,并不是失去焦点或提交时才进行判断的。
    0Kelvin
        10
    0Kelvin  
       2017-11-14 08:47:47 +08:00
    考虑把两个提示分开,这样就不会有覆盖结果的情况了吧?不知道我理解的对不对-。-
    fds
        11
    fds  
       2017-11-14 10:03:13 +08:00
    @Corbusier 其实已经“超长”了,是不是敏感字就不重要了,反正也不接受,都不用 ajax。当然如果按我之前说的顺序(或者你开始的要求),敏感字优先的话,那应该先显示“验证中”,ajax 回来才根据结果显示是“敏感词”还是“超长”。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:57 · PVG 14:57 · LAX 22:57 · JFK 01:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.