angular - 确保最后一个 http post 在 Angular 中最后到达后端

标签 angular rxjs observable httpclient

我如何确保最后一个 http post 在 Angular 中最后到达后端?

我的用例。我有一个简单的由我实现的芯片列表。它由芯片和末尾的输入表示。当用户在输入中键入内容并按下 Enter 时,带有键入文本的筹码将添加到筹码列表中,用户也可以从列表中删除特定筹码。在添加和删除时,我都在后端更新芯片列表。这是负责此操作的一段代码。

addNewChip() {
    if(this.chipText) {
        this.chips.push(this.chipText);
        this.chipText = "";
        this.updateChipsOnBE();
    }
}

removeChip(chipText) {
    this.chips = this.chips.filter(text => text !== chipText);
    this.updateChipsOnBE();
}

private updateChipsOnBE(): Observable<string[]> {
    return this.chipAPI.update(this.BEAddress, this.chips);
}

现在我担心可能的竞争条件: this.chipAPI.update 操作可能尚未在 BE 上完成,而另一个 this.chipAPI.update 操作将以这样的方式触发,后者的操作将在前者之前完成。这意味着,用户将丢失他或她应用的最后更改。

我觉得 RxJS 中应该有一种方法来防止它,但我既找不到也想不出解决方案。

最佳答案

您需要在 chipAPI 中使用 concatMap 运算符。

类似于:

send$ = new Subject();

constructor(http: HttpClient) {
  this.send$.pipe(
    // contact waits until the inner stream has been completted.
    concatMap(([address, chips]) => this.http.post(address, chips).pipe(
      retry(5), // in case of failed request,
      // catchError(() => EMPTY), // perhaps we can ignore errors
    )),
    // takeUntil(this.destroy$), // you need to implement an unsubscribe trigger.
  ).subscribe();
}

update(address, chips): {
  this.send$.next([address, chips]);
}

关于angular - 确保最后一个 http post 在 Angular 中最后到达后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61950529/

相关文章:

angular - RxJS : Filter one observable using another observable

Angular - 从组件调用服务方法返回未定义

javascript - 为什么当数组元素相同时 Splice 只删除最后一个元素

javascript - 了解 RxJS 去抖语义

typescript - 为什么 tsc(Typescript 编译器)忽略 RxJS 导入?

SwiftUI 可观察对象未观察到

angular - 在 Angular 2 中应用条件样式

javascript - 如何在 Angular 中绑定(bind)多个插值模板?

javascript - child 在 Angular 2 中监听父事件

angular - 如何修复无法读取未定义的属性 'next'?