Как я могу получить доступ к автоматически созданному идентификатору документа при создании нового документа Firestore в Angular? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь вернуть идентификатор документа при его создании. Поскольку функции Firebase являются асинхронными, возвращаемое значение не будет завершено, пока не будет выполнен запрос. Как я могу предотвратить это, чтобы я мог ждать получения значения после выполнения запроса?

Эта функция создания документа находится в службе:

public makeDoc(title: string, score: number): any{

    const fields = {
      title: title,
      score: number
    }

   this.db.collection('saved').add(fields)
   .then(function(ref) {
     console.log(ref.id);
     return ref.id;
     })

  }

Я вызываю это изфункция, которая находится в компоненте:

onCreate() {
      const str = this.createService.makeDoc(this.title, this.score);
    console.log(str);

}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Вы не хотите предотвращать ожидание, пока запрос не будет выполнен, вы должны принять использование обещаний здесь.

Во-первых, если вы этого не сделали, убедитесь, что вы импортировали пространство имен firestore вуслуга:

import { firestore } from 'firebase';

Теперь для вашего обслуживания:

Мне пришлось немного изменить ваш метод makeDoc, так как объект fields не былсозданный действительным способом (например, повторное использование типа number):

public makeDoc(titleParam: string, scoreParam: number): Promise<firestore.DocumentReference> {
  const fields = {
    title: titleParam,
    score: scoreParam
  };

  return this.db.collection('saved').add(fields);
}

Теперь это возвращает Promise<DocumentReference>, который, после разрешения, ссылка будет указывать на созданный документ.

Теперь вызов к нему в onCreate выглядит следующим образом:

onCreate() {
  this.createService.makeDoc('myTitle', 123)
    .then((ref) => { console.log(ref.id); })
    .catch((err) => { console.log(err); });
}

И это будет регистрировать идентификатор, как только он станет доступен.

0 голосов
/ 07 ноября 2019

Попробуйте следующее:

const fields = {
      title: title,
      score: number
    }


  var newFieldsRef = this.db.collection('saved').push();
  this.db.collection('saved').child(newFieldsRef).set(fields);

  var id = newFieldsRef.toString();
...