javascript - 无法使用 Promise => Promise.all 更新 Firebase 引用值

标签 javascript firebase firebase-realtime-database es6-promise

我在 firebase 中有两个引用: 1、产品 2.营养

场景是当用户完成选择列表时,应从产品引用(1)下维护的产品目录中选择营养(2)引用中的营养值(value)

这是我正在尝试使用的代码,但不确定我缺少什么,下面的代码仅更新第一个产品的营养成分。我是 Angular2 和 firebase 的新手。

   //capturing promises
   let promises = Object.keys(choices)
   .map(k => {
      return new Promise((resolve, reject) => {
      this.updateNutrtion(choices[k].choice,resolve,reject);
   });
   });

   //promise.all
   Promise.all(promises).then((object)=> console.log(object));


  updateNutrtion(choice,res,rej){

      //logic to get the nutritions
        return new Promise((res,rej)=>{
  firebase.database().ref('/products/' + choice).once('value',function(snapshot){
                       snapshot.forEach(function(child){

                          var consumeDay;
                     var today = new Date().toISOString();
                    var year = today.split("-")[0];
                    var month = today.split("-")[1];
                    var day = ( today.split("-")[2] ).split("T")[0]

                    consumeDay = day + '-' + month + '-' + year; 

                          // update firebase nutrition 

                        firebase.database().ref('/nutritions/' + firebase.auth().currentUser.uid + '/' + consumeDay + '/' + child.ref.key).once('value',function(nutrition){

                            firebase.database().ref('/nutritions/' + firebase.auth().currentUser.uid + '/' + consumeDay + '/' + child.ref.key).update({

                              unit : child.val().unit,
                              value : (nutrition.val()!=null) ? (nutrition.val().value + child.val().value) : (child.val().value)

                          })
                        }) 

                           return false;
                       }) 

            }).then((key)=>{
              res(key);
            });



 })

 }

请帮助我哪里出错了。

最佳答案

解决了。如果这对其他人有帮助,请在下面发布代码。

  //handelling promises over an array   
let promises = Object.keys(choices)
 .map(k => {


   var val =this.updateAllNutritions(choices[k].choice)
   .then(function(values) { 
       var consumeDay;
    var today = new Date().toISOString();
    var year = today.split("-")[0];
    var month = today.split("-")[1];
    var day = ( today.split("-")[2] ).split("T")[0]
    consumeDay = day + '-' + month + '-' + year; 
       // console.log('all done', values); // [snap, snap, snap] 

        Object.keys(values)
        .map(j=>{

          var unit = firebase.database().ref('/nutritions/' + firebase.auth().currentUser.uid + '/' + consumeDay + '/' + values[j].valueOf).child('unit')
          var value = firebase.database().ref('/nutritions/' + firebase.auth().currentUser.uid + '/' + consumeDay + '/' + values[j].valueOf).child('value')
          unit.transaction(function(currentUnit){

            return values[j].unit;

          });

          value.transaction(function(currentValue){

            return currentValue + values[j].value;
          })



        })

    });

   });


      //update nutritions async function 
        updateAllNutritions(choice){

return firebase.database().ref('/products/' + choice).once('value').then(function(snapshot){
    var nutritions = [];

    var consumeDay;
    var today = new Date().toISOString();
    var year = today.split("-")[0];
    var month = today.split("-")[1];
    var day = ( today.split("-")[2] ).split("T")[0]

    consumeDay = day + '-' + month + '-' + year; 
    snapshot.forEach(function(childSnapshot){
        var promise =  firebase.database().ref('/nutritions/' + firebase.auth().currentUser.uid + '/' + consumeDay + '/' + childSnapshot.ref.key).once('value').then(function(snap){

            var snapNull = null;
            if(snap.val()!=null){
             // console.log("currentvalue" + snap.val().value);
              snapNull = snap.val().value
            }


           let promisedettrue = {
            unit : childSnapshot.val().unit,
            value : childSnapshot.val().value,
            valueOf : childSnapshot.ref.key,
            isNodenull : false,
            currentValue : snapNull
          };
           let promisedetfalse = {
            unit : childSnapshot.val().unit,
            value : childSnapshot.val().value,
            valueOf : childSnapshot.ref.key,
            isNodenull : true,

          };
          if(snap.val()==null){
            return promisedetfalse;

          }else{
            return promisedettrue;
          }



        },function(error){
          // The Promise was rejected.
            console.error(error);
        });
        nutritions.push(promise);
    });
    return Promise.all(nutritions);
},function(error){
   // The Promise was rejected.
    console.error(error);
})


   }

关于javascript - 无法使用 Promise => Promise.all 更新 Firebase 引用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41752866/

相关文章:

javascript - 将 DOM 节点作为属性传递给 Polymer

javascript - 在单独的工作表中将 HTML 表格导出到 Excel (.xls)

Android - Firebase 复杂(或非)查询 - 唯一 ID 问题

javascript - 在实际网页上显示 chrome 控制台内容

java - 在Android中同时从多个Firebase数据库引用中检索数据

javascript - 在 javascript 中使用 'new' 关键字的替代方法是什么?

Angular 路由保护的 AngularFireAuth 重定向问题

firebase - 如何使用 RxJava 2 改进从 Firebase 数据库读取 Flowable<Object> 数据?

firebase - 在 Firebase 函数中过滤数据

javascript - 有没有办法在 ui-view 之外重新加载 angular.js 指令?