【发布时间】:2020-01-03 13:17:51
【问题描述】:
我有一个 observable 可以跟踪表单的变化。当表单更新时,它应该通过向服务器发送 HTTP PUT 请求来自动保存。我想要这种行为,以便在进行更改时发送第一个 HTTP 请求。对于任何后续更改,在前一个请求完成之前不应发送任何请求。当上一个请求完成后,我想只发送最新的更新。
我曾考虑过使用排气映射,例如formChanges$.pipe(exhaustMap(data => sendHttpUpdate(data))); 因为这会给我在请求进行时忽略所有更新的行为。但是,所有数据在执行过程中都会丢失,因此我需要重新触发 formChanges$ 可观察对象以发送最新更新,否则它将被忽略。
我也考虑过 concatMap 例如formChanges$.pipe(concatMap(data => sendHttpUpdate(data))); 因为这会等待上一个请求完成,但会按顺序发送所有更新,而不仅仅是最新的。
我想使用纯 rxjs 解决方案,即使用 Observables、Subjects 和运算符,而不使用变量设置状态。我是否缺少可以实现此目的的明显运算符或运算符组合?
这是我迄今为止最好的尝试:
const $send = new Subject();
formChanges$.pipe(
sample($send),
switchMap(this.fakeHttpRequest),
)
.subscribe(handleResponse);
formChanges$.pipe(first())
.subscribe(() => $send.next());
其中 fakeHttpRequest 是一个函数,它接受值 formChanges$ 并返回 HTTP 请求的 Observable。
这并不令人满意,因为我必须在第一次更改表单后手动触发第一次发送,我觉得这并不能很好地传达代码的意图。
【问题讨论】:
-
所以,只是重申问题 - 您需要缓冲连续更新直到当前 Web 请求完成,然后跳过除最后一个缓冲更新之外的所有更新?
-
是的,就是这样
标签: angular rxjs reactive-programming