记一次 RXjs 中 Subject 的使用经历
inputA blur 的时候会触发自己的表单验证并发出一个请求,请求数据,填入 input C
点击按钮 B,会触发 A 、C 的表单验证,并发送 A 、C 中的数据给服务端
问题来了,需要保证 A 的异步完成之后再进行 B 的异步请求,于是第一时间想到用 rxjs 的 subject
思路是这样:
创建一个 subject D,
按钮 B 订阅 D,subscribe 的 next 定义为 发送 A 、C 数据给服务端的异步操作
这样 Input A 在异步获取 C 的回调中 触发 subject D 的 next 方法,把请求结果通过 subject 分发给 B
B 再在 subscribe 中接收 D 分发来的值,把数据发送给服务端
但是实操过程 中发现 B 的表单验证会慢于 A 的 next…… 也就是 A 已经请求完数据把数据推送给 D 了,但是 B 表单验证还没完…… 所以接收不到 A 传过来的值,无法继续发送请求
无奈只好又创建了 subject E, 在 A 的请求发出去之前 订阅 B 的表单验证等待其完成,subscribe 的 next 为 A 请求 C 数据的过程……
这样一来,B 就需要在验证完成之后 触发 E 的 next, 把表单验证完成这个事情告诉 A …… A 接到 B 验证成功的消息之后再通过 D 把 请求结果发给 B……
好了,写完之后测试了一下,和预想中的结果一样,完美……
??
那 A blur 的时候如果人没在点击 B,不就没法通知 A 表单验证完成可以继续了吗?
所以需要加一个判断…… 判断 A 的 blur 事件的 relatedTarget 存不存在且是不是 B, 如果不存在或者不是 B 那么就由 A 自己通知自己完成请求 C 的值的过程。
这下终于怎么测都没问题了。
然后我发现直接 click 按钮 B 的时候 也发送 A 的请求,然后在 A 请求的回调里面进行 B 的后续请求即可
只要在 A blur 的时候判断一下 relatedTarget 存不存在且是不是 B
如果不存在或者不是 B 那么 A 就不发请求
完事
蛋疼。