-1

Я пытаюсь создать соединение в Firebase.Сгладить Наблюдаемый <Object[]>>

Итак, я асинхронно получаю массив идентификаторов из db, а для каждого id я асинхронно загружаю фактический объект. И функция должна возвращать Observable

Таким образом, с первым асинхронным запросом я получаю Observable (строка - это id). Итак, что бы я здесь ни попробовал, я либо получаю Observable, либо какой-то другой материал, который я не хочу получать.

Код:

getUserFavourites(userId = ""):Observable<any[]> { 
    return this.af.database.list('/ranks_by_user/likes/'+userId, { 
    query: { 
     orderByKey: true, 
     limitToFirst: 50 
    } 
    }).flatMap((likes:any[]) => { 
    return like.map(like => { 
     return this.af.database.object("/citations/" + like.$key) 
    }); 
    }); 
} 

И ошибка:

Type 'Observable<FirebaseObjectObservable<any>>' is not assignable to type 'Observable<any[]>'.

+0

Можете ли вы включить код в вопрос? – cartant

+0

Обновление с кодом –

+0

Вам нужно будет включить код для 'Citation'. Is - это интерфейс или класс? Если это класс, по крайней мере, вам нужно указать, какие параметры принимает конструктор. – cartant

ответ

3

Вы можете использовать forkJoin, чтобы получить массив ссылок. Обратите внимание, что оператор first используется для получения текущего значения из object наблюдаемых, так как forkJoin требует наблюдаемого для завершения:

import { Observable } from "rxjs/Observable"; 
import "rxjs/add/observable/forkJoin"; 
import "rxjs/add/operator/first"; 
import "rxjs/add/operator/switchMap"; 

getUserFavourites(userId): Observable<any[]> { 
    return this.af.database.list('/ranks_by_user/likes/' + userId, { 
    query: { 
     orderByKey: true, 
     limitToFirst: 50 
    } 
    }) 
    .switchMap((likes: any[]) => Observable.forkJoin(
    likes.map(like => this.af.database.object("/citations/" + like.$key).first()) 
)); 
} 

forkJoin принимает массив наблюдаемых и возвращает наблюдаемое, который излучает массив наблюдаемого финала значения.

Если вы должны были вернуть экземпляры Citation, вам необходимо создать их (предположительно, используя значения из базы данных). Для этого вы можете использовать оператор map:

import "rxjs/add/operator/map"; 
... 
likes.map(like => this.af.database.object("/citations/" + like.$key).first().map(value => new Citation(value))) 
... 
+0

Отлично! Спасибо. Работает как ожидалось –