【问题标题】:Angular rxjs conditionally call HTTP endpointAngular rxjs 有条件地调用 HTTP 端点
【发布时间】:2020-12-02 18:32:02
【问题描述】:

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

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

TS2345:“Observable”类型的参数不可分配给“(值:HasId,索引:数字)=> ObservableInput”类型的参数。类型 'Observable' 不匹配签名 '(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)
    )
}

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你必须从mergeMap的投影函数中返回一个值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-25
        • 2018-04-19
        • 1970-01-01
        • 2021-12-08
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        相关资源
        最近更新 更多