Вам не нужно прослушивать изменения через snapShotChanges / valueChanges.
Просто выполните простое получение с ограничением (1) (нам все равно, если существует более 1 имени пользователя) и проверьте, равен ли размер> 0. Если> 0 => имя пользователя занято, в противном случае имя пользователя доступно:
const db = firebase.firestore()
const isUserNameTaken = async (tag: string): Promise<boolean> => {
const query = db.collection('usernames').where('username', '==', tag).limit(1)
const docs = await query.get()
return !!docs.size
}
// returns true if username taken otherwise returns false
const isTaken = await isUserNameTaken('John')
if (isTaken) // do something