вроде такого ?
$isRestApiAvailable = this.http.get(this.apiPath,{observe: 'response'}).pipe(
catchError((err ) => {
console.error(err);
return of(false);
}),
map((res: HttpResponse<Object>) => res.status === 200),
shareReplay(1, 5000),
);
$isRestApiAvailable.subscribe()...
Сейчас если подписываюсь на этот $isRestApiAvailable, то получаю ошибку:
EmptyError: no elements in sequence
> EmptyError: no elements in sequence Где именно?
а что в нём там? Покажите весь код
export const ServerCheckGuardFn: CanActivateChildFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => { const restApiService = inject(CrmRestApiService); const router = inject(Router); return restApiService.$isRestApiAvailable.pipe( take(1), map((isAvailable: boolean) => { if (!isAvailable) { return router.parseUrl(ERROR_ROUTE); } else { return true; } }) ); };
call stack куда указывает?
core.mjs:10592 ERROR Error: Uncaught (in promise): EmptyError: no elements in sequence Error at _super (createErrorClass.js:4:26) at new EmptyErrorImpl (EmptyError.js:3:5) at first.js:9:179 at throwIfEmpty.js:10:71 at OperatorSubscriber._complete (OperatorSubscriber.js:36:21) at OperatorSubscriber.complete (Subscriber.js:49:18) at OperatorSubscriber._complete (Subscriber.js:72:30) at OperatorSubscriber.complete (Subscriber.js:49:18) at OperatorSubscriber._complete (Subscriber.js:72:30) at OperatorSubscriber.complete (Subscriber.js:49:18) at resolvePromise (zone.js:1193:31) at resolvePromise (zone.js:1147:17) at zone.js:1260:17 at _ZoneDelegate.invokeTask (zone.js:402:31) at core.mjs:10735:55 at AsyncStackTaggingZoneSpec.onInvokeTask (core.mjs:10735:36) at _ZoneDelegate.invokeTask (zone.js:401:60) at Object.onInvokeTask (core.mjs:11048:33) at _ZoneDelegate.invokeTask (zone.js:401:60) at Zone.runTask (zone.js:173:47) вообще в zone.js
А что за subscribe тут?
это просто пример как я использую
Тут кстати в случае ошибки упадёт на map, т.к. вы отдаёте of(false), а в map проверяете .status. first нигде не юзаете?
нет, это походу гуарды так обрабатываются
А че не кешировать по классике? В сервисе?
потому что RxJs это должен уметь, shareReplay зачем тогда придумали... возможно guard юзает что-то вроде take(1) и подписывается каждый раз на observable, поэтому оно и тупит
точно?
Ну ок, вы правы, но я вам обяснил чем не подходит кеширование именно ответов
ну... после уточнения кейса - я таки склонен согласиться
Обсуждают сегодня