Angular rxjs 有条件地调用 HTTP 端点

Angular rxjs conditionally call HTTP endpoint

我正在尝试进行一些 Trello 自动化,因此我正在调用 API 来创建一个列表,其中 return 是一个 ID。然后,如果我指定了卡片名称,我需要使用列表 ID 并行进行另一组调用。无论我是否创建卡片,我都想 return 创建的列表的 ID。

虽然编译器不喜欢我在 iif 调用中所做的事情,但这样说:

TS2345: Argument of type 'Observable<string[]>' is not assignable to parameter of type '(value: HasId, index: number) => ObservableInput'.   Type 'Observable<string[]>' provides no match for the signature '(value: HasId, index: number): ObservableInput'.

虽然我不确定它为什么要分配给 (value: HasId, index: number) => ObservableInput<any>,所以我不知道如何解决。

这是我尝试使用的代码。

interface HasId {
    id: string
}

private createCard(idList: string, name: string): Observable<string> { ... }

private createList(boardId: string, name: string, cards?: string[]): Observable<string> {
  let idList = ''

  return this.http.post<HasId>(`boards/${boardId}/lists`, null, {params: {name}})
    .pipe(
      tap(x => idList = x.id),
      mergeMap(
        iif(
          () => cards,
          forkJoin(cards.map(name => this.createCard(idList, name)))
      )),
      map(() => idList)
    )
}

查看您的错误,您将能够注意到 mergeMap 接受返回 Observable(而不是实际 Observable)的函数,因此请考虑如下修改代码:

mergeMap(() =>
  iif(     
    () => cards,
    forkJoin(cards.map(name => this.createCard(idList, name)))
  )
)

您必须 return 来自 mergeMap 投影函数的值:

mergeMap(() => 
  iif(
    () => cards,
    forkJoin(cards.map(name => this.createCard(idList, name)))
  )
),