Rx JS: небезопасное использование уловов в эффектах и ​​эпопеях запрещено и требует вложения - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть эффект, основная идея которого состоит в том, чтобы сделать несколько «волшебников» c с API, основная проблема: сначала мне нужно сделать один запрос, после того, как он успешен, мне нужно сделать второй запрос. И все было в порядке, пока я не изменил свой код на этот (чтобы он выглядел более читабельным):

@Effect()
    myEffect$ = this.actions$.pipe(
        ofType(actionTypes.SomeDataAction),
        withLatestFrom(this.store.select(selectTheAwesome)),
        concatMap(([action, awesomeData]) =>
            forkJoin([
                of(awesomeData),
                this.myService.makeFirstMagic(
                    action.payload.someDataId
                )
            ])
        ),
        concatMap(data => {
            const [awesomeData, magicFirst] = data;

            return this.myService.makeSecondMagic(awesomeData.awesomeDataId, magicFirst.newId).pipe(
                mergeMap(response => {
                    return [new SomeDataActionSuccess(), new SomeAnotherDataAction([response])];
                })
            );
        }),
        catchError((error) => of(new SomeDataActionError({ error })))
    );

, но в результате ts-lint завершается с RxJS: Unsafe catch usage in effects and epics is forbidden. Что я делаю не так? Почему раньше работал (проходите линтинг) с таким кодом?

@Effect()
    myEffect$ = this.actions$.pipe(
        ofType(actionTypes.SomeDataAction),
        withLatestFrom(this.store.select(selectTheAwesome)),
        mergeMap(([action, awesomeData]) => {
            return this.myService.makeFirstMagic(action.payload.someDataId).pipe(
                mergeMap(magicFirst => {
                    return this.myService.makeSecondMagic(awesomeData.awesomeDataId, magicFirst.newId).pipe(
                        mergeMap(response => {
                            return [new SomeDataActionSuccess(), new SomeAnotherDataAction([response])];
                        })
                    );
                })
            );
        }),
        catchError(error => of(new SomeDataActionError({ error })))
    );

1 Ответ

2 голосов
/ 22 февраля 2020

Вы должны использовать catchError для каждого метода обслуживания, например,

this.myService.makeSecondMagic(awesomeData.awesomeDataId, magicFirst.newId).pipe(
                mergeMap(response => {
                    return [new SomeDataActionSuccess(), new SomeAnotherDataAction([response])];
                }),
                catchError(....)
            );

...