2016-07-15 5 views
0

Firebaseを使用する際に問題が発生しました。エクスプレスサーバを使用してFirebaseデータベースからデータを取得し、そのデータをJadeテンプレートで使用できるオブジェクトとして渡したいと思います。私は2つの異なるエンドポイントからデータを取得し、そのデータを下に示すfirebaseDataオブジェクトのキーの値に設定します。キーと値を持つオブジェクトを受け取る代わりに、私の2つの値はそれぞれPromise {<pending>}です。私はこれを見るために私のfirebaseDataオブジェクトをコンソールにログアウトし、何もDOMにレンダリングされません。ページをあまりに早くレンダリングしていますか?FirebaseとExpress/Node.jsを使用してプロミスを保留にする

コンソールで
app.get("/cac", function(req, res){ 

    var firebaseData = {}; 

    function getFirebaseData(endpoint){ 
    return firebase.database().ref(endpoint).once("value", function(snapshot){ 
      return snapshot.val(); 
    }); 
    } 

    firebaseData.members = getFirebaseData("CAC_Members"); 

    firebaseData.events = getFirebaseData("CAC_Events"); 

    console.log(firebaseData); 
    res.render("cac", firebaseData); 

}); 

:ここに私が働いているコードがある

{ members: Promise { <pending> }, 
    events: Promise { <pending> } } 

私は約束して任意の経験を持っていなかったが、私は私が作業する必要がやっているもののように感じています。これを行うより良い方法はありますか?私はどんなポインタにも感謝します!

答えて

3

Firebaseデータは非同期にロードされます。約束はこれに対処する一つの方法であり、彼らはあなたの必要性に適しています。

app.get("/cac", function(req, res){ 

    var firebaseData = {}; 

    function getFirebaseData(endpoint){ 
    return firebase.database().ref(endpoint).once("value", function(snapshot){ 
      return snapshot.val(); 
    }); 
    } 

    Promise.all([getFirebaseData("CAC_Members"), getFirebaseData("CAC_Events")).then(function(snapshots) { 
    firebaseData.members = snapshots[0]; 
    firebaseData.events = snapshots[1]; 
    console.log(firebaseData); 
    res.render("cac", firebaseData); 
    }); 
}); 
+0

Woot:

あなたのコードは、すべての約束が満たされるまで、Promise.all()と非常に簡単である、待つ必要があります!フランクに感謝します。これは私にとってうまくいった、私は迅速かつ役立つ応答に感謝します。 – m00saca

関連する問題