Как дождаться завершения массива, затем выполнить функцию? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть некоторые проблемы. Я хочу, чтобы моя функция выполнялась, когда мой массив завершен. Но моя функция выполняется, хотя мой массив не завершен. Вы можете исправить мой код, пожалуйста ..

const historyPermintaanObat2 = obat => {
let array = [];
db.child("itemPermintaan")
  .orderByChild("id")
  .equalTo(obat.id)
  .on("child_added", snapshot => {
    let obj = snapshot.val();
    let registerPermintaanRef = db.child(
      `registerPermintaan/${obj.idPermintaan}`
    );
    registerPermintaanRef.once("value", snap => {
      let username = snap.val().username;
      let createdAt = snap.val().createdAt;
      let approvedAt = snap.val().approvedAt;
      let unit = snap.val().unit;
      let obj2 = { ...obj, username, createdAt, approvedAt, unit };
      array.push(obj2);

    });
  });
return array;
};

Результат - [] пустой массив. Если я изменю return array.length > 0 && array, ничего не произойдет ..

1 Ответ

0 голосов
/ 16 апреля 2020

Я понял, используйте once и Promise.all()

const historyPermintaanObat2 = obat => {
db.child("itemPermintaan")
  .orderByChild("id")
  .equalTo(obat.id)
  .once("value", snapshot => {
    let array = [];
    let obj = Object.values(snapshot.val());
    obj.forEach(e => {
      let registerPermintaanRef = db.child(
        `registerPermintaan/${e.idPermintaan}`
      );
      let promise = registerPermintaanRef.once("value").then(snap => {
        let username = snap.val().username;
        let createdAt = snap.val().createdAt;
        let approvedAt = snap.val().approvedAt;
        let unit = snap.val().unit;
        let obj2 = { ...e, username, createdAt, approvedAt, unit };
        return obj2;
      });
      array.push(promise);
    });
    return Promise.all(array).then(value => {
      return value;
    });
  });
 };

Вот ссылка, которую я получил Promise.all с Firebase DataSnapshot.forEach

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