2017-07-11 4 views
2

Ich habe die nächste Funktion in meinem WebApp mit Firebase:Lassen Sie sich von zwei Versprechen in Firebase-Datenbank führen

function loadMonthData(){ 
    let ganancias = 0; 
    let perdidas = 0; 
    let thisMonth = new Date(); 

    thisMonth.setHours(0); 
    thisMonth.setMinutes(0); 
    thisMonth.setMilliseconds(0); 
    thisMonth.setDate(1); 

    fireIngresos.orderByChild('timestamp') 
     .startAt(thisMonth.getTime()) 
     .once('value') 
     .then((snapshot)=>{ 
      snapshot.forEach((ingreso)=>{ 
       ganancias += ingreso.val().cash; 
      }); 
     }); 

    fireGastos.orderByChild('timestamp') 
     .startAt(thisMonth.getTime()) 
     .once('value') 
     .then((snapshot)=>{ 
      snapshot.forEach((perdida)=>{ 
       perdidas += perdida.val().cash; 
      }); 
     }); 

    return ganancias - perdidas; 
} 

Das die Summe der Immobilie cash aller Elemente in meine Referenzen fireIngresos und FireGastos erhalten (von Anfang an des Monats), dann gibt dies den Unterschied der beiden Ergebnisse zurück.

Das Problem (offensichtlich) ist das Versprechen ¿Wie kann ich das richtig machen?

+0

Was Ergebnis erwartet? – guest271314

+0

@ guest271314 ¿der Unterschied der beiden Ergebnisse? –

+0

Aktualisierte Post anzeigen – guest271314

Antwort

3

können Sie async/await verwenden, return ein Wert von .then()

async function loadMonthData(){ 

    let ganancias = 0; 
    let perdidas = 0; 
    let thisMonth = new Date(); 

    thisMonth.setHours(0); 
    thisMonth.setMinutes(0); 
    thisMonth.setMilliseconds(0); 
    thisMonth.setDate(1); 

    return await fireIngresos.orderByChild('timestamp') 
      .startAt(thisMonth.getTime()) 
      .once('value') 
      .then(snapshot => { 
      snapshot.forEach(ingreso => { 
       ganancias += ingreso.val().cash; 
      }); 
      return ganacias 
      }) 
     - await fireGastos.orderByChild('timestamp') 
      .startAt(thisMonth.getTime()) 
      .once('value') 
      .then(snapshot => { 
      snapshot.forEach(perdida => { 
       perdidas += perdida.val().cash 
      }); 
      return peridadas 
      }); 

} 

loadMonthData().then(result => {// do stuff with result}); 

function promise(n) { 
 
    return new Promise(resolve => 
 
      setTimeout(resolve, Math.floor(Math.random() * 1000), n) 
 
     ).then(data => data) 
 
} 
 

 
async function diff() { 
 
    return await promise(2 * 4) - await promise(2 * 2); 
 
} 
 

 
diff().then(res => console.log(res)); // 4

+2

FYI ['snapshot'] (https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot) ist kein Array. – Phil

+0

@Phil Firebase nicht ausprobiert. Was muss angepasst werden, um das Ergebnis zu erhalten? – guest271314

+0

Sie können 'reduce' nicht verwenden. Du bist fest mit 'forEach' leider – Phil

Verwandte Themen