Firebase хорошее использование Observable (rxjs) на угловых 2+ - PullRequest
0 голосов
/ 19 ноября 2018

В данный момент я без проблем использую Subject из Rxjs, простой пример:

Услуги

 rooms: Room[] = [];
    roomsSubject = new Subject<Room[]>();

    emitRooms() {
        this.roomsSubject.next(this.rooms);
    }

    getRooms() {
        firebase.database().ref('/rooms').on('value', data => {
            this.rooms = data.val() ? Object.values(data.val()) : [];
            console.log(data.val());
            this.emitRooms();
        }, error => {
            console.log("getRooms: ", error);
        });
    }

Компонент:

rooms: Room[];
roomsSubscription: Subscription;
ngOnInit() {
    this.roomService.getRooms();
    this.roomsSubscription = this.roomService.roomsSubject.subscribe((rooms: Room[]) => {
        this.rooms = rooms;
    });

}

Все работает нормально, но в этом случае мне просто нужен Observable (я не посылаю данные от клиента). Поэтому я попытался обновить этот код до:

getRooms() {
    return firebase.database().ref('/rooms').on('value', data => {
        return of(data.val());

    }, error => {
        console.log("getRooms: ", error);
    });
}

Компонент:

ngOnInit() {
    this.roomsSubscription = this.roomService.getRooms().subscribe((rooms: Room[]) => {
        this.rooms = rooms;
    });

}

Ошибка при подписке:

ошибка TS2339: свойство «подписка» не существует для типа »(a: DataSnapshot, b ?: string) => any '

После обновления до:

getRooms(): Observable<any> {

Я получил:

ошибка TS2322: Тип '(a: DataSnapshot, b ?: string) => any' не является присваивается типу «Наблюдаемый». Свойство _isScalar является отсутствует в типе '(a: DataSnapshot, b ?: string) => any'.

Все время, пока я следовал за стеками, исправлял свои ошибки, и все время получал новые ошибки. Я занимаюсь разработкой кода Visual Studio.

Есть ли шанс использовать Observable без Angularfire?

1 Ответ

0 голосов
/ 19 ноября 2018

Причиной ошибки является то, что вы возвращаете все, что возвращается из firebase.database().ref('/rooms').on(...), который является значением типа (a: DataSnapshot, b?: string) => any.Вместо этого вы хотите отправить Observable.

Для этого вы можете просто использовать Observable.create в этом случае.А в случае ошибки вы можете использовать throwError:

...
import { Observable, throwError } from 'rxjs';
...

@Injectable()
export class RoomService {

  getRooms(): Observable<any> {
    return Observable.create(observer => {
      firebase.database().ref('/rooms').on('value', data => {
        return observer.next(data.val());
      }, error => {
        return throwError(error);
      });
    });
  }

}
...