2017-12-12 4 views
0

Ich muss 2 firebase calls ausführen, um bestimmte Daten aus der Datenbank abrufen. Once these promises resolve, ich möchte eine andere Funktion mit den abgerufenen Daten aufrufen. Wie kann ich das machen? ..something mit Promise.All?wie mehrere Firebase verspricht und dann einmal ausgeführt, führen Sie die Funktion

-Code unten:

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

Antwort

1

Ja, Sie ein Promise.all seit once('value') Renditen nutzen können.

Schnell n schmutzig Beispiel:

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

Wenn Sie NodeJS von Version 7.6 verwenden und höher Sie können diesen Code auch mit Asynchron-Funktion schreiben, die viel einfacher

// ... 

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(...) 
})) 
zu lesen und zu pflegen
Verwandte Themen