Moh Jonaidy
Moh Jonaidy

Reputation: 75

How to wait array until complete, then execute the function?

i have some trouble. I want my function execute when my array is complete. But the my function execute although my array is not complete. can you fix my code please..

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;
};

The result is [] empty array. If i change the return array.length > 0 && array nothing is happen..

Upvotes: 0

Views: 371

Answers (1)

Moh Jonaidy
Moh Jonaidy

Reputation: 75

I have figured it out, use once and 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;
    });
  });
 };

Here's the reference i've got Promise.all with Firebase DataSnapshot.forEach

Upvotes: 1

Related Questions