Как вернуть true или false, если документ существует в Angular Firebase? - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я работаю над проектом, который требует angular в качестве внешнего интерфейса и Firebase в качестве внутреннего. Однако, когда я запрашивал do c, я не могу что-то сделать в моментальном снимке, но, похоже, ничего не могу вернуть.

this.afs.doc(`meals/${meal.id}`).collection('pending', ref => ref.where('uid', '==', this.authService.getUserID())).valueChanges().pipe(take(1)).subscribe(matchingRecs => {
  if(matchingRecs.length > 0) {
    return true;
  }
  else return false
})

У меня есть это на данный момент, и оно возвращается недоопределенным, но я знаю, что это правда, потому что журнал консоли печатает true

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

Вы возвращаете что-то в функции подписчика, и она не должна ничего возвращать. Если вам нужно что-то вернуть, вы должны подписаться на переменную, которая получает возврат и использовать карту вместо подписки:

let result!: boolean = this.afs.doc(`meals/${meal.id}`)
  .collection('pending', ref => ref.where(
    'uid', '==', this.authService.getUserID())
  ).valueChanges().pipe(
    map(matchingRecs => !!matchingRecs.length),
    take(1)
  );

result.subscribe(console.log);

Вы можете использовать get вместо valueChanges, чтобы получить единственное значение :

let result!: boolean = this.afs.doc(`meals/${meal.id}`)
  .collection('pending', ref => ref.where(
    'uid', '==', this.authService.getUserID())
  ).get().pipe(
    map((v: firestore.QuerySnapshot<firestore.DocumentData>) => !!v.docs.length)
  );

result.subscribe(console.log);
0 голосов
/ 31 марта 2020

Я бы атаковал немного иначе, но, основываясь на вашем запросе, самое простое изменение было бы:

return this.afs.doc(`meals/${meal.id}`)
      .collection('pending', ref => ref.where('uid', '==', 
          this.authService.getUserID()))
      .valueChanges()
      .pipe(switchMap(docs => of(docs.length > 0)));

- или -

return this.afs.doc(`meals/${meal.id}`)
      .collection('pending', ref => ref.where('uid', '==', 
          this.authService.getUserID()))
      .valueChanges()
      .pipe(map(docs => docs.length > 0));

- или если вы нужно вернуть обещание наблюдаемой -

async myFunc() : Promise<boolean> {
    const hasRecords = await this.afs.doc(`meals/${meal.id}`)
      .collection('pending', ref => ref.where('uid', '==', 
          this.authService.getUserID()))
      .valueChanges()
      .pipe(map(docs => docs.length > 0)).toPromise();

    return hasRecords;
}
0 голосов
/ 31 марта 2020

попробуйте включить в канал оператор карты

pipe(map(matchingRecs => matchingRecs.length > 0))

, тогда при подписке вы получите только логические значения. также вы не можете вернуть что-то из подписки, вам нужно написать logi c внутри обратного вызова подписки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...