Я пытаюсь реализовать распознаватель, который сначала отправляет действие для извлечения всех данных с сервера, а затем я пытаюсь захватить два потока responseOK и responseError, а затем из возврата преобразователя, который когда-либо из потоков генерирует значение первым. Эта настройка основана на следующем ответе на github https://github.com/ngrx/store/issues/270#issuecomment-317232654
, вот мой распознаватель:
@Injectable({
providedIn: "root"
})
export class ScheduleAdministrationResolver
implements Resolve<Observable<Schedule.FetchAllSportTypesSuccess | Schedule.FetchAllSportTypesFailed>> {
constructor(private store: Store, private actions$: Actions, private router: Router) {}
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
):
| Observable<Schedule.FetchAllSportTypesSuccess | Schedule.FetchAllSportTypesFailed>
| Observable<Observable<Schedule.FetchAllSportTypesSuccess | Schedule.FetchAllSportTypesFailed>>
| Promise<Observable<Schedule.FetchAllSportTypesSuccess | Schedule.FetchAllSportTypesFailed>> {
this.store.dispatch(new Schedule.FetchAllSportTypes());
const responseOK = this.actions$.pipe(ofAction(Schedule.FetchAllSportTypesSuccess));
const responseError = this.actions$.pipe(
ofAction(Schedule.FetchAllSportTypesFailed),
tap(() => this.router.navigate([""]))
);
console.log("Inside SportType resolver");
return race(responseOK, responseError).pipe(first());
}
}
метод this.store.dispatch(new Schedule.FetchAllSportTypes());
в итоге вызывает fetchAllSportTypes()
, который выглядит так:
fetchAllSportTypes(): Observable<SportType[]>{
return of([{...}, {...}])
}
Все работает, как ожидалось, и срабатывает, как и ожидалось. Однако решатель никогда не завершается. Кажется, что потоки внутри метода race
никогда не излучают никаких значений. Я точно знаю, что действие Schedule.FetchAllSportTypesSuccess
отправляется, когда я регистрирую его на консоли, когда оно запускается.
Я не понимаю, почему ofAction
не запускается, как ожидалось.
Дополнительная информация: это внутри функции администратора, которая загружается лениво. Я подключаю NGXS следующим образом:
app.module.ts;
imports: [
...NgxsModule.forFeature([SportTypeState]),
NgxsModule.forRoot([], {
developmentMode: true,
selectorOptions: {
suppressErrors: false,
injectContainerState: false
}
})
];