forkJoin Firebase Observable не завершена
Так что я пытался использовать forkJoin
с массивом Observable от Firebase, но, кажется, они не завершены.
Я пытался подать заявку .first()
или же .take(1)
поскольку оно должно завершить наблюдаемое, но, похоже, ничего не меняет.
getChat(userTwoId: string)
{
return this.auth.getAuthenticatedUser()
.map(auth =>
{
console.log(auth.uid);
return auth.uid;
})
.mergeMap(uid =>
{
console.log(`/user-messages/${uid}/${userTwoId}/`);
return this.database.list(`/user-messages/${uid}/${userTwoId}/`).snapshotChanges();
})
.mergeMap(chats =>
{
const oChats = chats.map(chat=>
{
console.log(`/messages/${chat.key}`);
return this.database.object(`/messages/${chat.key}`).valueChanges().first();
});
console.log('ObsevableMap');
console.log(oChats);
return Observable.forkJoin(oChats);
});
}
Мои Observables (из массива) возвращают что-то, когда я подписываюсь на них по отдельности, но forkJoin
не делает.
Так что я видел где-то, что Firebase Observable никогда не завершается. Если это правда, что будет лучшей альтернативой. И если это не так, что бы завершить их? разве нет способа заставить их завершить?
более подробно: так вот код, который я пытаюсь проверить:
this.auth.getAuthenticatedUser()
.map(auth =>
{
return auth.uid;
})
.mergeMap(uid =>
{
console.log('path to list of keys:')
console.log(`/user-messages/${uid}/${userTwoId}/`);
return this.database.list(`/user-messages/${uid}/${userTwoId}/`).snapshotChanges();
})
.mergeMap(chats =>
{
console.log('Log each path to object:');
const oChats = chats.map(chat=>
{
console.log(`/messages/${chat.key}`);
return this.database.object(`/messages/${chat.key}`).valueChanges().take(1);
});
//See if its log
//console.log('Log each Obs subscription:')
//oChats.forEach(a=>{a.subscribe(b=>{console.log(b)})});
return Observable.forkJoin(oChats);
}).subscribe(vals=>
{
console.log('Fork Subscription:');
console.log(vals)
});
this.auth.getAuthenticatedUser()
возвращает наблюдаемое текущего пользователя Firebase, затем я сопоставляю его, чтобы получить идентификатор пользователя.
В моей базе данных есть узел, который начинается с пользовательского uid, затем второго пользовательского uid и затем списка ключей сообщений, которые они отправили друг другу.
Поэтому я возвращаю эти ключи, чтобы в конечном итоге сопоставить каждый ключ с наблюдаемой, которая возвращает их сообщение.
После подписки с комментариями для проверки они возвращают что-то.
А потом я пытаюсь их объединить или объединить, но когда я подписываюсь, ничего не происходит.
Я пробовал с first()
вместо take(1)
,
Я старался изо всех сил, чтобы быть ясным, но я извиняюсь, чтобы не быть ^^
а вот мой лог когда подписка не комментируется
Подробнее Обновление
Ну, я попытался сделать демо на StackBlitz здесь
https://stackblitz.com/edit/angular-template-firebase-yvbkho
Я скопировал и вставил большую часть своего кода и создал еще одну базу данных Firebase с такой же структурой:
И моя демоверсия работает.
2 ответа
Я наконец заставил это работать... Я чувствую себя настолько глупым, и все же не было никакого способа заметить это.
Похоже, я импортировал свой Observable из:
import { Observable } from 'rxjs/observable';
вместо
import { Observable } from 'rxjs/Observable';
(если вы не заметили, что пропущен капитал)
не было никакого предупреждения от моей IDE и любой другой функции от наблюдаемой сработало...
По крайней мере, это задокументировано для других людей.
Спасибо за тех, кто пытался мне помочь ^^.
дело в том, что нет никаких предупреждений или ошибок, и это просто ничего не делает.
Если вы связываете с .valueChanges()
с .first()
он никогда ничего не будет излучать, потому что valueChanges()
никогда не завершается и .first()
оператор также не (см. Angular 2 с использованием RxJS - возьмите (1) против первого ()).
forkJoin
требует, чтобы все наблюдаемые источники испускали хотя бы один предмет и завершили его, что должно быть гарантировано take(1)
(но только если они излучают хотя бы один предмет).
take(1)
должен работать при условии, что valueChanges()
испускает, по крайней мере, один элемент, потому что он завершается сразу после пересылки значения.