В моем приложении Angular я использую преобразователь маршрута для возврата объекта «ресторан».
Однако, когда я загружаю маршрут, кажется, что наблюдаемое не завершается. Я добавил .pipe(take(1))
, чтобы убедиться, что он завершен, но это не работает.
Может ли кто-нибудь помочь мне определить, что я делаю неправильно?
ресторан.resolver.ts
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { TransferState } from "@angular/platform-browser";
import { Restaurant } from '../restaurants/Interfaces.model';
import { AngularFirestore } from '@angular/fire/firestore';
import { first, take } from 'rxjs/operators';
import { OrderFormService } from '../restaurants/order-form.service';
@Injectable()
export class RestaurantResolver implements Resolve<Restaurant> {
constructor(
public afs: AngularFirestore,
private transferState: TransferState,
public orderForm: OrderFormService,
@Inject(PLATFORM_ID) private platformId) {
}
resolve(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<any> {
let restaurant = this.afs.doc('restaurants/thaiHouse').valueChanges().pipe(take(1))
console.info('e', restaurant)
return restaurant
}
}
@martin Из-за оператора console.info я знаю, что он выдает. Итак, я запускаю приложение, перехожу прямо к этому маршруту, а затем оно регистрирует объект ресторана, а затем просто зависает (также без тайм-аута). Браузер просто вращается, поэтому единственное, что имеет смысл, это то, что этот наблюдаемый объект не завершается.
Но журнал консоли не означает, что Observable испускает. Он просто выводит объект Observable на консоль. Попробуйте использовать, например, оператор tap()
в цепочке, чтобы увидеть, действительно ли он излучает (tap(v => console.info(v))
).
Я не уверен, что сделал это так, как вы предполагали, но он печатает объект, когда я делаю это: let restaurant = this.afs.doc('restaurants/thaiHouse').valueChanges().pipe( tap(v = > console.info('v', v)), взять(1))
Да это оно. Если он регистрируется, то take(1)
завершает цепочку, поэтому, если он выглядит так, как будто это не так, проблема будет где-то еще.
@martin оказывается, это известная проблема с библиотекой. Спасибо за помощь. github.com/angular/angularfire/issues/2695
Это известная проблема с библиотекой Angularfire. Надеюсь, это скоро будет исправлено. См. проблему, задокументированную здесь: https://github.com/angular/angularfire/issues/2695
Вы используете
valueChanges()
, но действительно ли он излучает хотя бы один раз? Кстати, почему вы думаете, что это не завершено?