如何从nestjs saga发出多个命令?

时间:2019-02-12 11:05:18

标签: nestjs

我创建了一个传奇来响应给定的事件。在这种情况下,需要发出多个命令。

我的英雄传奇如下:

@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实现只是不支持发出多个命令?

3 个答案:

答案 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),
            );
        }
    }