多个顺序 api 调用 RxJs
Multiple sequential api calls RxJs
我需要使用 RxJs 进行顺序 api 调用。问题是第一个 Observable 发出一个数组,对于这个数组的每个项目,我应该设置一个自定义 url 以便进行下一次调用。在第二次调用中,我应该检查一些条件和 return Observable。
我的问题是,如何在 url 变化时调用数组的每个元素?
我试过类似的方法,但它只为最后一项设置 url,而不是为每一项设置。
private func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
map((response) => response.items),
mergeMap((result) => {
result.map((order) =>
this.orderService.setCustomUrl(order.number)
);
return this.orderService.getItems().pipe(
mergeMap((response) => {
if (response.items.some((item) => item.number === this.model.number)) {
return of(true);
} else {
return of(false);
}
}),
);
})
);
}
这就是您的代码中发生的情况:
{
// for each "result" array element, call "this.orderService.setCustomUrl(order.number)"
result.map((order) =>
this.orderService.setCustomUrl(order.number)
);
// assuming "setCustomUrl" is setting the one variable, this will cause only the last "order.number" to be set at this point here
// then this last part executes once and returns the boolean only for the last order
return this.orderService.getItems().pipe(
mergeMap((response) => {
if (response.items.some((item) => item.number === this.model.number)) {
return of(true);
} else {
return of(false);
}
}),
);
}
我认为目的是验证 this.orderService.getItems()
使用 order.number
返回的任何订单是否具有来自 this.model.number
的商品编号,因此您应该改为执行以下操作:
首先更改您的服务电话,以便它可以使用这样的订单号 this.orderService.getItems(order.number)
然后是:
private func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
switchMap((orders) =>
from(orders.items).pipe(
// for each item on the initial response return an observable,
// mapping its result to a boolean as your initial function
mergeMap((order) =>
this.orderService
.getItems(order.number)
.pipe(map((itemsResponse) => itemsResponse.items.some((item) => item.number === this.model.number)))
)
)
),
// this will get all the observable boolean values and only yield when all resolve
toArray(),
// this aggregates all boolean vals into one
map((all) => all.some((x) => x)),
// and we complete the subscription after first yield
take(1)
)
原因是您调用了 setCustomUrl()
,但直到 map()
完成后才使用 .getItems()
。因此,当您调用 .getItems()
时,该服务已从您的 .map()
.
接收到最后一项
您可以使用以下代码来获得想要的结果。
function func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
map((response) => response.items),
switchMap(items => from(items).pipe(
concatMap(item=>{
this.orderService.setCustomUrl(item.number);
return this.orderService.getItems().pipe(
map(response => response.items.some((item) => item.number === this.model.number))
);
}),
toArray()
)),
map(items => items.some(item => item))
);
}
from()
运算符转换一个数组,并单独发出每个值。这是我们输入和 return .some()
布尔值的地方。
toArray()
获取所有这些值并将其转换回数组。
然后我们最后做一个 map()
看看是否所有项目都是真实的。
我需要使用 RxJs 进行顺序 api 调用。问题是第一个 Observable 发出一个数组,对于这个数组的每个项目,我应该设置一个自定义 url 以便进行下一次调用。在第二次调用中,我应该检查一些条件和 return Observable。 我的问题是,如何在 url 变化时调用数组的每个元素?
我试过类似的方法,但它只为最后一项设置 url,而不是为每一项设置。
private func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
map((response) => response.items),
mergeMap((result) => {
result.map((order) =>
this.orderService.setCustomUrl(order.number)
);
return this.orderService.getItems().pipe(
mergeMap((response) => {
if (response.items.some((item) => item.number === this.model.number)) {
return of(true);
} else {
return of(false);
}
}),
);
})
);
}
这就是您的代码中发生的情况:
{
// for each "result" array element, call "this.orderService.setCustomUrl(order.number)"
result.map((order) =>
this.orderService.setCustomUrl(order.number)
);
// assuming "setCustomUrl" is setting the one variable, this will cause only the last "order.number" to be set at this point here
// then this last part executes once and returns the boolean only for the last order
return this.orderService.getItems().pipe(
mergeMap((response) => {
if (response.items.some((item) => item.number === this.model.number)) {
return of(true);
} else {
return of(false);
}
}),
);
}
我认为目的是验证 this.orderService.getItems()
使用 order.number
返回的任何订单是否具有来自 this.model.number
的商品编号,因此您应该改为执行以下操作:
首先更改您的服务电话,以便它可以使用这样的订单号 this.orderService.getItems(order.number)
然后是:
private func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
switchMap((orders) =>
from(orders.items).pipe(
// for each item on the initial response return an observable,
// mapping its result to a boolean as your initial function
mergeMap((order) =>
this.orderService
.getItems(order.number)
.pipe(map((itemsResponse) => itemsResponse.items.some((item) => item.number === this.model.number)))
)
)
),
// this will get all the observable boolean values and only yield when all resolve
toArray(),
// this aggregates all boolean vals into one
map((all) => all.some((x) => x)),
// and we complete the subscription after first yield
take(1)
)
原因是您调用了 setCustomUrl()
,但直到 map()
完成后才使用 .getItems()
。因此,当您调用 .getItems()
时,该服务已从您的 .map()
.
您可以使用以下代码来获得想要的结果。
function func(): Observable<boolean> {
return this.service
.getItems()
.pipe(
map((response) => response.items),
switchMap(items => from(items).pipe(
concatMap(item=>{
this.orderService.setCustomUrl(item.number);
return this.orderService.getItems().pipe(
map(response => response.items.some((item) => item.number === this.model.number))
);
}),
toArray()
)),
map(items => items.some(item => item))
);
}
from()
运算符转换一个数组,并单独发出每个值。这是我们输入和 return .some()
布尔值的地方。
toArray()
获取所有这些值并将其转换回数组。
然后我们最后做一个 map()
看看是否所有项目都是真实的。