Angular: return 来自 forkJoin 其他可观察对象内部管道的值
Angular: return value from forkJoin inside pipe of other observable
这是我需要实现的场景:
- 我调用了一个 API,它 return 是一个包含对象数组的响应
- 我将这些对象映射到另一个对象数组
- 对于这个新对象数组的每一项,我需要调用另一个 API 调用
- 第二次调用的响应必须在我在 2 中创建的数组的每个对象中设置一个值。
- 我想 return 一个带有对象数组的可观察对象 4.
到目前为止,我已经能够创建以下内容:
public getWishlist ( receiver : Person) : Observable<Wish[]>{
return this.http$.get<IWishlistResponse[]>(environment.apiUrl + 'wishlist/' + receiver.id).pipe(
map( (response) => {
let wishes: Wish[] = [];
response[0].wishes.forEach((wish) => {
wishes.push(new Wish(
wish._id,
wish.title,
wish.price,
null,
wish.url
));
});
return wishes;
}),
tap( (wishes) => {
let wishStateObservables = wishes.map(wish => this.http$.get<wishStatus>(environment.apiUrl + 'wish/' + wish.id + '/state').pipe(catchError(() => of(null))));
forkJoin(wishStateObservables)
.pipe(
map(states => {
states.forEach((state, index) => {
wishes[index].status = state;
});
return wishes;
})
).subscribe((wishes => { console.log(wishes) }));
})
);
forkjoin 订阅中 console.log 中的 'wishes' 是我想要在我的可观察对象中 return 的值,但我无法在这个可观察对象中获取它们。
那么我应该使用什么来代替 'tap' 运算符。能够将 forkJoin 管道的结果放入可观察 I return?
尝试将 tap
切换为 switchMap
,从而切换到新的可观察对象。
import { switchMap } from 'rxjs/operators';
...
public getWishlist ( receiver : Person) : Observable<Wish[]>{
return this.http$.get<IWishlistResponse[]>(environment.apiUrl + 'wishlist/' + receiver.id).pipe(
map( (response) => {
let wishes: Wish[] = [];
response[0].wishes.forEach((wish) => {
wishes.push(new Wish(
wish._id,
wish.title,
wish.price,
null,
wish.url
));
});
return wishes;
}),
switchMap( (wishes) => { // change to switchMap to switch to new observable
let wishStateObservables = wishes.map(wish => this.http$.get<wishStatus>(environment.apiUrl + 'wish/' + wish.id + '/state').pipe(catchError(() => of(null))));
return forkJoin(wishStateObservables); // add return here to return for the switchMap
}),
map(states => { // remove the inner pipe from the forkJoin and put the pipe in outer pipe
states.forEach((state, index) => {
wishes[index].status = state;
});
return wishes;
}),
);
这是我需要实现的场景:
- 我调用了一个 API,它 return 是一个包含对象数组的响应
- 我将这些对象映射到另一个对象数组
- 对于这个新对象数组的每一项,我需要调用另一个 API 调用
- 第二次调用的响应必须在我在 2 中创建的数组的每个对象中设置一个值。
- 我想 return 一个带有对象数组的可观察对象 4.
到目前为止,我已经能够创建以下内容:
public getWishlist ( receiver : Person) : Observable<Wish[]>{
return this.http$.get<IWishlistResponse[]>(environment.apiUrl + 'wishlist/' + receiver.id).pipe(
map( (response) => {
let wishes: Wish[] = [];
response[0].wishes.forEach((wish) => {
wishes.push(new Wish(
wish._id,
wish.title,
wish.price,
null,
wish.url
));
});
return wishes;
}),
tap( (wishes) => {
let wishStateObservables = wishes.map(wish => this.http$.get<wishStatus>(environment.apiUrl + 'wish/' + wish.id + '/state').pipe(catchError(() => of(null))));
forkJoin(wishStateObservables)
.pipe(
map(states => {
states.forEach((state, index) => {
wishes[index].status = state;
});
return wishes;
})
).subscribe((wishes => { console.log(wishes) }));
})
);
forkjoin 订阅中 console.log 中的 'wishes' 是我想要在我的可观察对象中 return 的值,但我无法在这个可观察对象中获取它们。 那么我应该使用什么来代替 'tap' 运算符。能够将 forkJoin 管道的结果放入可观察 I return?
尝试将 tap
切换为 switchMap
,从而切换到新的可观察对象。
import { switchMap } from 'rxjs/operators';
...
public getWishlist ( receiver : Person) : Observable<Wish[]>{
return this.http$.get<IWishlistResponse[]>(environment.apiUrl + 'wishlist/' + receiver.id).pipe(
map( (response) => {
let wishes: Wish[] = [];
response[0].wishes.forEach((wish) => {
wishes.push(new Wish(
wish._id,
wish.title,
wish.price,
null,
wish.url
));
});
return wishes;
}),
switchMap( (wishes) => { // change to switchMap to switch to new observable
let wishStateObservables = wishes.map(wish => this.http$.get<wishStatus>(environment.apiUrl + 'wish/' + wish.id + '/state').pipe(catchError(() => of(null))));
return forkJoin(wishStateObservables); // add return here to return for the switchMap
}),
map(states => { // remove the inner pipe from the forkJoin and put the pipe in outer pipe
states.forEach((state, index) => {
wishes[index].status = state;
});
return wishes;
}),
);