Обещание не ждать завершения запроса Firebase и будет решено слишком рано - PullRequest
1 голос
/ 08 апреля 2019

Я создал обещание, которое будет принимать массив ключей Firebase в качестве входных данных, зацикливать их для запроса базы данных Firebase в реальном времени. Моя проблема в том, что даже после того, как я использую async await, для firebase, чтобы обеспечить результаты, обещание быстро решается.

function firebaseQuery(keys){
  const result = [];
  return new Promise((resolve, reject) => {
    keys.forEach((key) => {
      const snap = app.child(key).once('value');
      const snapJSON = await snap.then(snapshot => snapshot.toJSON());
      result.push({ key: key, post: snapJSON });
      console.log(result);
    });
    resolve(result);
  });
}

1 Ответ

1 голос
/ 08 апреля 2019

forEach не делает пауз для операторов ожидания, поэтому не будет работать так (https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404). Лучше отобразить ключи в массив обещаний, а затем использовать Promise.all (), чтобы дождаться, пока все они решаются. Как-то так (просто убедитесь, что обработали ваши ошибки)

async function firebaseQuery(keys){
  const result = await Promise.all(keys.map(async key => {
    const snap = app.child(key).once('value');
    const snapJSON = await snap.then(snapshot => snapshot.toJSON());
    const returnValue = { key: key, post: snapJSON };
    console.log(returnValue);
    return returnValue;
  }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...