2017-12-12 24 views
0

2 firebase callsを実行して、特定のデータをデータベースから取得する必要があります。 Once these promises resolve、取得したデータで別の関数を呼び出す必要があります。これどうやってするの?以下Promise.All?複数のfirebase約束を実行して一度完了したら、関数を実行する方法

コードで..something:

app.post('/testtwilio', function(req, res) { 
    //save request variables 
    var to_UID = req.body.to; 
    var from_UID = req.body.from; 
    var experience_id = req.body.exp_id; 

    //Query firebase and save 'zone_id' which we need later 
    firebase.database().ref('experiences').child(experience_id).once('value').then((snap) => { 
    zone_id = snap.val().ZoneID; 
    }); 

    //Query firebase and save 'from_name' which we need later 
    firebase.database().ref('users').child(from_UID).once('value').then((snap) => { 
    from_name = snap.val().Name; 
    }); 

    //Once we have the two variables returned and saved 
    //Call a final firebase query and a twilio function with all the recieved data 
    firebase.database().ref('users').child(to_UID).once('value').then((snap) => { 
    //Do something with this aggregated data now 
    client.messages.create({ 
     //blah blah do something with the saved data that we retrieved 
     var phone = snap.val().Phone; 
     var msg = from_name + zone_id + from_UID + experience_id 
    }); 
    }); 
}); 

答えて

1

はい、あなたはPromise.allonce('value')以来の戻りいずれかを使用することができます。

クイックnは汚い例:

var promises = []; 
promises.push(firebase.database().ref('experiences').child(experience_id).once('value')); 
promises.push(firebase.database().ref('users').child(from_UID).once('value')); 

// Wait for all promises to resolve 
Promise.all(promises).then(function(res) {   
    // res[0] is your experience_id snapshot 
    // res[1] is your from_UID snapshot 
    // Do something... 
}); 
1

あなたはバージョン7.6と高いのNodeJSを使用している場合、また、どのくらいに簡単

// ... 

const wrap = require('express-async-wrap') 

// ... 
         // need to wrap async function 
         // to make it compatible with express 
app.post('/testtwilio', wrap(async (req, res) => { 
    const to_UID = req.body.to 
    const from_UID = req.body.from 
    const experience_id = req.body.exp_id 

    const [ 
    snap1, 
    snap2, 
    snap3 

    // waiting for all 3 promises 
    ] = await Promise.all([ 
    firebase.database().ref('experiences').child(experience_id).once('value'), 
    firebase.database().ref('users').child(from_UID).once('value'), 
    firebase.database().ref('users').child(to_UID).once('value') 
    ]) 

    const zone_id = snap1.val().ZoneID 
    const from_name = snap2.val().Name 
    const phone = snap3.val().Phone 
    const msg = from_name + zone_id + from_UID + experience_id 

    // ... 
    client.messages.create(...) 
})) 
を読み、維持するために、非同期機能で、このコードを書くことができます
関連する問題