【问题标题】:Get result from two promises in Firebase Database从 Firebase 数据库中的两个承诺中获取结果
【发布时间】:2017-12-14 20:57:44
【问题描述】:

我的 WebApp 中使用 Firebase 有下一个功能:

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

这会得到我的引用 fireIngresos 和 FireGastos 中所有元素的属性 cash 的总和(从月初开始),然后返回两个结果的差。

问题(显然)是承诺 ¿我怎样才能正确地做到这一点?

【问题讨论】:

  • 预期结果是什么?
  • @guest271314 ¿两个结果的差异?
  • 查看更新后的帖子

标签: javascript firebase firebase-realtime-database promise


【解决方案1】:

您可以使用async/awaitreturn 来自.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

【讨论】:

  • 仅供参考 snapshot 不是数组。
  • @Phil 没有尝试过firebase。需要调整哪些内容才能获得 OP 预期的结果?
  • 你不能使用reduce。不幸的是,你被forEach 卡住了
  • 有效!但有些变量的名称错误,例如“peridadas”(是 perdidas)
  • @guest271314 ganancias 是利润,perdidas 是西班牙语的损失:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2016-12-05
  • 2017-10-18
  • 2021-02-18
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多