1
chnwillliu 2020-11-03 05:13:35 +08:00
感觉不需要 Subject 吧。
A blur 会触发验证并发请求,这个就它自己管好自己就 OK 。B click 需要检测当前有无正在 pending 的 A blur 引起的请求,有则等待,无则直接做自己该做的事。 不追求完全函数编程,就可以把 A blur 发请求的 observable 用变量保存起来。 大概这个意思: ``` let pendingRequest = null; inputABlur$ .pipe( switchMap(() => { pendingRequest = httpClient.get('/url', data).pipe(share()); return pendingRequest; }), finallize(() => { pendingRequest = null; }) ) .subscribe(); buttonBClick$ .pipe( switchMap(value => { if (pendingRequest) { return pendingRequest.pipe(mapTo(value)); } return of(value); }), switchMap(() => httpClient.get('/url-a-c', dataAC)) ) .subscribe(); ``` |
2
chnwillliu 2020-11-03 05:21:19 +08:00
你这里的表单验证具体是什么操作?不应该是同步的操作么?
|
3
xuanbg 2020-11-03 07:41:05 +08:00
在 A 的回调里面显示 B 按钮,这样就能保证 A 返回正确结果后 B 才变得可点击。凡是需要套娃的都可以套用这个方法。
|
4
shakukansp OP @chnwillliu 一般是用户填完了 a 以后 blur,看到 c 框内的数据改变了,然后再去点 B
但是现在测试的时候有粘贴到 a 以后直接点 B 的情况,这里需要处理 blur -> click 极短时间内的异步流程 @xuanbg 确实,但是这个问题的场景就像上面说的,用户粘贴到 a 以后直接去点了 b,现在想想获取一开始设置 b 不可点击,C 有值的时候再允许点击比较好 |
5
chnwillliu 2020-11-03 10:25:09 +08:00 via Android
@shakukansp blur 总是会优先于 click 触发的,所以 click 内部判断有无 blur 引起的 request 在 pending 就可以。
不知道你的 A 框中的值不同会不会影响 C 框得到不一样的结果,如果会的话,C 有值再 enable B 按钮这种方案还是有问题。 |
6
shakukansp OP @chnwillliu 确实不妥,我尝试一下你的方法
|