2017-01-21 5 views
4

У меня есть 3 параллельных огня. И мне нужно присоединиться к ним как к одному объекту. Код, как показано ниже:Как объединить 3 наблюдателя базы данных без потери динамических обновлений

import {Http} from "@angular/http"; 
import {AngularFireDatabase} from "angularfire2"; 
import {Thread} from "../model/thread"; 
import {Message} from "../model/message"; 
import {Participant} from "../model/participant"; 

constructor(private http: Http, private db:AngularFireDatabase) { } 

loadUserThreads(uid): Observable<AllUserData> { 
return Observable.forkJoin([ 
    this.db.list('participant/' + uid + '/threads').first(), 
    this.db.list('participant/' + uid + '/messages').first(), 
    this.db.list('participant/' + uid + '/participants').first() 
]) 
    .map((data:any[]) => { 
    let threads: Thread[] = data[0]; 
    let messages: Message[] = data[1]; 
    let participants: Participant[] = data[2]; 
    let AllUserData = { 
     threads: threads, 
     messages: messages, 
     participants: participants 
    } 
    return AllUserData; 
    }) 
    } 

Эта работа и возвращает точный формат, мне нужно, что с этим интерфейсом:

export interface AllUserData { 
    participants: Participant[]; 
    threads: Thread[]; 
    messages: Message[]; 
} 

Проблема в том forkJoin не будет работать без .Первый() все firebase наблюдаемые. И если я использую .first(), чтобы завершить все наблюдаемые базы данных, я ПОТЕРЯЛ динамические обновления, из-за которых я использую firebase на первом месте. Как я могу получить лучшее от мира? - Сохраняйте наблюдаемые данные о бомбе, но можете присоединиться к ним, как мой формат интерфейса? Я тяну свои волосы на этом. Любая помощь будет оценена!

ответ

10

Вместо .forkJoin(...) вы можете использовать .combineLatest(...).

Я также сделал линии тока ваш map немного:

Observable.combineLatest(
    this.db.list('participant/' + uid + '/threads'), 
    this.db.list('participant/' + uid + '/messages'), 
    this.db.list('participant/' + uid + '/participants') 
) 
.map(([threads, messages, participants]: [Thread[], Message[], Participant[]]) => 
    ({ threads, messages, participants }) 
) 
+0

Ха-ха! Это снова @olsn, вот день! Огромное спасибо. Да, но просто переключитесь на работу combLatest ... Интересно, будет ли порядок изменения массива зависеть от того, какие наблюдаемые испускают в первую очередь? Я читал где-то forkJoin сохранить порядок разных наблюдаемых и combLatest нет? –

+3

Заказ должен всегда оставаться неизменным с combLatest, так же как forkJoin – olsn

+0

@olsn боролся с этим на некоторое время, спасибо – Roy