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

2017-11-13 13:40:32 +08:00
 Corbusier

流程是这样的:

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

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

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

解决思路 1:

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

解决思路 2:

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

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

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

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

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

不过我没明白为什么同步的判断优先级要比敏感词低。按理说应该是先通过了同步判断再进行 ajax 验证的。
Corbusier
2017-11-13 18:51:36 +08:00
@fds 感谢回复!如果按照先同步判断再进行 ajax 验证,展示结果提示:超长||特殊字符,用户继续输入敏感词,异步返回敏感词提示。这样不就是涉及到了展示混乱的问题了吗?请求过程取反结果亦然。不过这和我的事件绑定也有关系,我的表单验证绑定的是"input"事件,并不是失去焦点或提交时才进行判断的。
0Kelvin
2017-11-14 08:47:47 +08:00
考虑把两个提示分开,这样就不会有覆盖结果的情况了吧?不知道我理解的对不对-。-
fds
2017-11-14 10:03:13 +08:00
@Corbusier 其实已经“超长”了,是不是敏感字就不重要了,反正也不接受,都不用 ajax。当然如果按我之前说的顺序(或者你开始的要求),敏感字优先的话,那应该先显示“验证中”,ajax 回来才根据结果显示是“敏感词”还是“超长”。

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

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

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

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

© 2021 V2EX