У меня есть приложение Angular с маршрутизацией и решателем охраны.Защита разрешения является асинхронной и возвращает наблюдаемую информацию, возвращаемую из HttpClient.post
- проблема в том, что запрос AJAX завершается, а наблюдаемая - нет, и поэтому распознаватель никогда не завершает свою работу, и страница никогда не отображается.Однако, когда я передаю результат через take(1)
, он завершается и работает нормально.Мой вопрос почему?Разве HttpClient.post
не должен завершиться после того, как AJAX-запрос вернется нормально (200 OK
)?
Вот код моего распознавателя:
@Injectable()
export class MyDataResolver implements Resolve<MyData> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)
: MyData | Observable<MyData> | Promise<MyData> {
return this.svc.getData().pipe(take(1)); // <-- Why is take(1) necessary here??
}
constructor(private svc: MyService) { }
}
Вот метод обслуживания, который вызывает post
:
import { HttpClient } from '@angular/common/http';
export class MyService {
constructor(private http: HttpClient) {}
getData(): Observable<MyData> {
return this.http.post('/api/data'), {}).pipe(
map((resp: { data: SomeData }) => resp.data),
map(r => convertSomeDataToMyData(r)));
}
}
Спасибо