从 ngrx/store 效果返回 forkJoin 的结果
Returning the result of a forkJoin from an ngrx/store effect
我正在尝试使用 ngrx 存储 return forkJoin
的结果,就像这个伪代码演示的那样:
@Effect()
someEffect$: Observable<Action> = this.action$.pipe(
ofType<SomeActionType>(ActionTypes.SomeActionType),
switchMap((action: any) =>
this.http.get<any>('some/url').pipe(
map(someResult => {
// this implementation is unimportant, just the gist of the flow I'm after
const potentialResults = oneOrMany(someResult);
if( potentialResults.length === 1 ) {
return new SomeAction(potentialResults[0]);
} else {
observables: Observable<any> = getObservables(someResult);
forkJoin(observables).subscribe((result) =>
// this is where I get stuck
return new SomeAction(result);
)
}
}
))
)
如何从 forkJoin
的结果同步 return 一个动作?目前,我正在直接向 forkJoin
块内的商店发送一个动作,但这很臭,我想知道我如何 return forkJoin
中的这个动作] 块,使用另一个运算符,例如 map
或类似的东西。有任何想法吗?
您不能 return 来自 map() 回调的 Observable。您需要使用 switchMap()
(或另一个 xxxMap()
)来做到这一点。您也无法订阅 forkJoin 可观察对象。相反,您必须 map()
:
someEffect$: Observable<Action> = this.action$.pipe(
ofType<SomeActionType>(ActionTypes.SomeActionType),
switchMap(() => this.http.get<any>('some/url'),
switchMap(someResult => {
const potentialResults = oneOrMany(someResult);
if (potentialResults.length === 1) {
return of(new SomeAction(potentialResults[0]));
} else {
const observables: Array<Observable<any>> = getObservables(someResult);
return forkJoin(observables).map(result => new SomeAction(result))
}
})
)
您可以创建一个主题并return它:
someEffect$ = createEffect(() => this.actions$.pipe(
ofType(SomeType.Save),
mergeMap(action => {
const obsList: Observable<any>[] = createList();
const sub: Subject<Action> = new Subject<Action>();
forkJoin(obsList).subscribe(() => {
sub.next(new SomeAction());
sub.complete();
});
return sub;
})));
我正在尝试使用 ngrx 存储 return forkJoin
的结果,就像这个伪代码演示的那样:
@Effect()
someEffect$: Observable<Action> = this.action$.pipe(
ofType<SomeActionType>(ActionTypes.SomeActionType),
switchMap((action: any) =>
this.http.get<any>('some/url').pipe(
map(someResult => {
// this implementation is unimportant, just the gist of the flow I'm after
const potentialResults = oneOrMany(someResult);
if( potentialResults.length === 1 ) {
return new SomeAction(potentialResults[0]);
} else {
observables: Observable<any> = getObservables(someResult);
forkJoin(observables).subscribe((result) =>
// this is where I get stuck
return new SomeAction(result);
)
}
}
))
)
如何从 forkJoin
的结果同步 return 一个动作?目前,我正在直接向 forkJoin
块内的商店发送一个动作,但这很臭,我想知道我如何 return forkJoin
中的这个动作] 块,使用另一个运算符,例如 map
或类似的东西。有任何想法吗?
您不能 return 来自 map() 回调的 Observable。您需要使用 switchMap()
(或另一个 xxxMap()
)来做到这一点。您也无法订阅 forkJoin 可观察对象。相反,您必须 map()
:
someEffect$: Observable<Action> = this.action$.pipe(
ofType<SomeActionType>(ActionTypes.SomeActionType),
switchMap(() => this.http.get<any>('some/url'),
switchMap(someResult => {
const potentialResults = oneOrMany(someResult);
if (potentialResults.length === 1) {
return of(new SomeAction(potentialResults[0]));
} else {
const observables: Array<Observable<any>> = getObservables(someResult);
return forkJoin(observables).map(result => new SomeAction(result))
}
})
)
您可以创建一个主题并return它:
someEffect$ = createEffect(() => this.actions$.pipe(
ofType(SomeType.Save),
mergeMap(action => {
const obsList: Observable<any>[] = createList();
const sub: Subject<Action> = new Subject<Action>();
forkJoin(obsList).subscribe(() => {
sub.next(new SomeAction());
sub.complete();
});
return sub;
})));