我创建了一个传奇来响应给定的事件。在这种情况下,需要发出多个命令。
我的英雄传奇如下:
@Injectable()
export class SomeSagas {
public constructor() {}
onSomeEvent(events$: EventObservable<any>): Observable<ICommand> {
return events$.ofType(SomeEvent).pipe(
map((event: SomeEvent) => {
return of(new SomeCommand(uuid()), new SomeCommand(uuid()));
}),
);
}
}
调试时,我发现抛出“ CommandHandler not found exception!”错误,这有点令人困惑,因为如果我仅返回SomeCommand
的一个实例,则会正确调用命令处理程序。
我会错过某些东西吗,还是saga实现只是不支持发出多个命令?
答案 0 :(得分:0)
似乎我找到了答案–它与RxJS有关:
@Injectable()
export class SomeSagas {
public constructor() {}
onSomeEvent(events$: EventObservable<any>): Observable<ICommand> {
return events$.ofType(SomeEvent).pipe(
map((event: SomeEvent) => {
const commands: ICommand[] = [
new SomeCommand(uuid()),
new SomeCommand(uuid()),
new SomeCommand(uuid()),
];
return commands;
}),
flatMap(c => c), // piping to flatMap RxJS operator is solving the issue I had
);
}
}
答案 1 :(得分:0)
您可以使用mergeMap()
发出另一个可观察的物体。它会继续发出该可观察的对象,直到它完成为止,但是如果您使用of()
可观察的对象,那么它将立即全部发生。
onSomeEvent(events$: EventObservable<any>): Observable<ICommand> {
return events$.ofType(SomeEvent).pipe(
mergeMap((event: SomeEvent) => of(
new SomeCommand(uuid()),
new SomeCommand(uuid()),
new SomeCommand(uuid()),
))
);
}
}
答案 2 :(得分:0)
由于 flatMap 已被弃用,您可以使用 mergeMap 代替:
@Injectable()
export class Saga {
public constructor() {}
onSomeEvent(events$: EventObservable<any>): Observable<ICommand> {
return events$.ofType(SomeEvent).pipe(
map((event: SomeEvent) => {
const commands: ICommand[] = [
new FirstCommans(uuid()),
new SecondCommand(uuid()),
];
return commands;
}),
mergeMap(c => c),
);
}
}