0

私は数多くの投稿をチェックしましたが、問題を解決できませんでした。 先に進む前に配列を返す必要があります。私はコールバックで関数を使用しようとしましたが、どちらもうまくいきませんでした。Firebase関数 - NodeJS:非同期配列処理

私のコードは次のようになります。

exports.GetHelmets = functions.database.ref('onTrack/{userID}').onCreate(event => { 
var helmets = []; 

let userID = event.params.userID; 

let friendRef = admin.database().ref("friends").child(userID); 
friendRef.once("value").then(snapshot => { 
    snapshot.forEach(function(snapshot2){ 
     let rider = snapshot2.val(); 
     let riderID = rider.id; 

     let rhRef = admin.database().ref("User").child(riderID); 
     rhRef.once("value", function(snapshot3){ 

      let rider2 = snapshot3.val(); 
      let helmetID = rider2.helmet; 

     if (helmetID != "STANDARD"){ 
      if(helmets.indexOf(helmetID) < 0){ 
       helmets.push(helmetID); 
      }; 
     }; 
    }); 
}); 
    return helmets; 
}).then(helmets => { 

    //WORK WITH ARRAY 
}); 

私はあなたが私を助けることを願って、ありがとう!

答えて

1

最後にthen()にすべての内部データを取得したい場合は、それぞれonce()を呼び出す必要があります。そのような場合は、Promise.all()を使用してonceのすべてを待ってください。

exports.GetHelmets = functions.database.ref('onTrack/{userID}').onCreate(event => { 
let userID = event.params.userID; 

let friendRef = admin.database().ref("friends").child(userID); 
friendRef.once("value").then(snapshot => { 
    var promises = []l 
    snapshot.forEach(function(snapshot2){ 
     let rider = snapshot2.val(); 
     let riderID = rider.id; 

     let rhRef = admin.database().ref("User").child(riderID); 
     promises.push(rhRef.once("value"); 
     }); 
    }); 
    return Promise.all(promises); 
}).then(snapshots => { 
    var helmets = []; 

    snapshots.forEach((snapshot) => { 
     let rider2 = snapshot.val(); 
     let helmetID = rider2.helmet; 

     if (helmetID != "STANDARD"){ 
      if(helmets.indexOf(helmetID) < 0){ 
      helmets.push(helmetID); 
      }; 
     }; 
    }); 
    // WORK WITH helmets 
}); 
関連する問題