Я проверяю свою базу данных на наличие ссылки (которая существует), и я не получаю никаких чатов, но не вижу где.
chat.service.ts:
getUserChats(): Observable<Chat[]> {
let uid = '-1';
this.auth.currUser.subscribe(user => (uid = user.uid));
this.chats = this.afs
.collection('chats', ref => ref.where('members', 'array-contains', `users/${uid}`))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return {id, ...data};
});
})
) as Observable<Chat[]>;
return this.chats;
}
Код предназначен для получения всех чатов, в которых зарегистрированный пользователь является участником. Я делаю это, проверяя массив members, есть ли на него какие-либо ссылки.
chat.component.ts:
chats: Observable<Chat[]>;
constructor(private router: Router, public chatService: ChatService, public dialog: MatDialog, public auth: AuthService) { }
ngOnInit() {
this.chats = this.chatService.getUserChats();
}
chat.component.html:
<mat-list-option *ngFor = "let chat of chats | async" (click) = "handleClick(chatList)" [value] = "chat.id">
<img matListAvatar src = "./assets/avatar.svg" alt = "Avatar Icon">
<h3 mat-line>{{chat.name}}</h3>
<p mat-line>test</p>
</mat-list-option>
Структура чата:



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


По-видимому, вы запрашиваете users/uid, в то время как это /users/uid, который хранится в вашей базе данных, см. Первый /
Я думаю, что вы вернете this.chat из службы до возврата Observable с сервера. вам нужно вернуть самого Observable .... попробуйте это изменение:
getUserChats(): Observable < Chat[] > {
let uid = '-1';
this.auth.currUser.subscribe(user => (
uid = user.uid;
//that what you need to return
return this.afs
.collection('chats', ref => ref.where('members', 'array-
contains ', `users/${uid}`))
.snapshotChanges()
.pipe(
map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Chat;
const id = action.payload.doc.id;
return { id,...data };
});
})
) as Observable < Chat[] > ;
}
));
Каждый Observable должен подписаться - но в angular асинхронный канал делает это за вас, поэтому вам просто нужно передать ему Observable.
я редактирую свой ответ - теперь запрос ожидает ответа от пользователя auth
Я не хочу подписываться, я хочу получить Observable в качестве возвращаемого значения @yehonatan yehezkel
Я думаю, что оператор switchMap rxjs решит вашу проблему. youtu.be/65Us8NwmYf4?t=242
Значение '-1' будет искать мгновенно, потому что я не жду завершения работы User Observable, поэтому он ищет -1 и ничего не находит, поэтому мне нужно дождаться пользователя Observable. Тогда все еще не знаю, как вернуть внутреннее наблюдаемое.
К вашему сведению, я только что провел несколько тестов, и косые черты (/) в значении массива не создают никаких проблем (я подозревал, что, возможно, / были причиной проблемы ... но нет). Если я протестирую вашу модель базы данных и значения с помощью «чистого» кода javascript, запрос будет работать хорошо.