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)))
)
),
我正在尝试进行一些 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)))
)
),