Firebase несколько асинхронных запросов, возвращаемых через Promises - PullRequest
1 голос
/ 29 мая 2019

У меня есть функция Firebase, которая пытается взять массив UID и вернуть массив пользовательских объектов. Я пытаюсь использовать Promise.all() для возврата всех асинхронных результатов, но мне возвращается пустой массив. Я, однако, получаю результаты после выхода из игры.

const fetchUserObjects = function(uids){
  let promises = []
  uids.forEach((uid) => {
    admin.database().ref(`/users/${uid}`).once("value")
    .then(function(dataSnapshot) {
      const userDataAll = dataSnapshot.val()
      const userData = {}
      userData.id = userDataAll.id
      userData.username = userDataAll.username
      userData.first = userDataAll.first
      userData.last = userDataAll.last

      promises.push(userData)
      console.log(userData)
    })
    .catch((error) => {
      // Re-throwing the error as an HttpsError so that the client gets the error details.
      throw new functions.https.HttpsError('unknown', error.message, error);
    });
  })

  return Promise.all(promises);

}

return fetchUserObjects(uids)

1 Ответ

2 голосов
/ 29 мая 2019

fetchUserObjects всегда возвращает пустой массив. Ничто не гарантирует, что асинхронная работа, начатая once(), выполняется до того, как вы поместите значения в массив. Также обратите внимание, что вы на самом деле не помещаете обещания в этот массив. Вы выдвигаете простые старые объекты JavaScript. Вместо этого вам нужно вставить в массив фактические обещания, и вам нужно делать это, не дожидаясь разрешения других обещаний. Вот как это должно выглядеть вместо этого:

const fetchUserObjects = function(uids){
  let promises = []
  uids.forEach((uid) => {
    const promise = admin.database().ref(`/users/${uid}`).once("value")
    .then(function(dataSnapshot) {
      const userDataAll = dataSnapshot.val()
      const userData = {}
      userData.id = userDataAll.id
      userData.username = userDataAll.username
      userData.first = userDataAll.first
      userData.last = userDataAll.last

      console.log(userData)
      return userData
    })
    .catch((error) => {
      // Re-throwing the error as an HttpsError so that the client gets the error details.
      throw new functions.https.HttpsError('unknown', error.message, error);
    });

    promises.push(promise)

  })

  return Promise.all(promises);

}

Обратите внимание, что обещание немедленно помещается в массив обещаний, и оно разрешается с помощью объекта userData, который был возвращен обратным вызовом then.

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