Как «контролировать», когда Firestore.getAll (... обещает) останавливается путем отказа - PullRequest
0 голосов
/ 17 января 2020

Контекст:

Я выполняю облачную функцию для отправки толчков нескольким пользователям. Мне нужно восстановить информацию о каждом пользователе, чтобы знать некоторые данные, такие как, имя, страна .. и т.д. c ..

Проблема:

На самом деле я восстанавливаю список идентификаторов пользователей и когда я его получил, я создаю массив promises для восстановления всей информации:

var usersPromises = []
for (var i = 0; i < usersInRange.length; i++) {
   usersPromises[i] = firestore.collection("users").doc(usersInRange[i])
}

Затем я восстанавливаю и отправляю pu sh, используя firestore.getAll():

firestore.getAll(...usersPromises).then(results => {
   for(snapshot in results){
      if(snapshot.exists){
         ......
         var user = snapshot.data()
         ......
      }else{
         ......
      }
   }
})

Этот solution фактически работает "нормально" почти все время. Но в этот момент в базе данных Firestore есть некоторые пользователи, которых не существует или что-то не так, потому что метод getAll() останавливается перед выполнением всех обещаний. Я знаю это, потому что pu sh не отправляется, и в консоли просто скажите, что метод завершен.

Читая в SO и документации, я увидел, что getAll останавливается, если какое-то обещание «нарушается» , (все или ничего)

И вот где я потерялся. Как я могу «заставить» или сделать по-другому, чтобы просто «прыгнуть» это обещание, которое не может быть выполнено?

PS:

Я пытался сделать с "для", но кажется, что некоторые обещания опущены:

for (var i = 0; i < usersPromises.length; i++) {
   usersPromises[i]
      .get()
      .then(snapshot => {
        if(snapshot.exists){
           ......
           var user = snapshot.data()
           ......
        }else{
           ......
        }
      })
}

1 Ответ

2 голосов
/ 17 января 2020

Я думаю, это не проблема getAll. Я проверил так:

const firestore = new Firestore();

let doc = []
doc[0] = firestore.doc('test/test');
doc[1] = firestore.doc('test/test1');
doc[2] = firestore.doc('test/doc');

firestore.getAll(...doc)
.then(result=> result.forEach(doc => console.log(doc._fieldsProto)))
.catch(err=>console.log(err));

В моей базе данных есть документ 'test / test' и 'test / do c', но у меня нет 'test / test1' и результаты выглядят как это:

enter image description here

Таким образом, мы просто получаем undefined для документа, который не существует, и это все. Я предлагаю добавить catch и посмотреть, есть ли исключения. Когда я писал тест, функция была прервана из-за опечатки во внутренней функции.

Надеюсь, это поможет!

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