Android 如何避免Firebase云函数中的嵌套承诺

Android 如何避免Firebase云函数中的嵌套承诺,android,firebase,firebase-realtime-database,firebase-cloud-messaging,google-cloud-functions,Android,Firebase,Firebase Realtime Database,Firebase Cloud Messaging,Google Cloud Functions,首先,当触发“TotalMoney”节点时,该函数从“OldNewKey”获取一个节点,然后获取另一个节点并进行更新。但这给了我们避免嵌套承诺的警告 exports.postMoneyUpdater = functions.database.ref('/TotalMoney/{fixedPostId}/').onWrite((change, context) => { const fixedPostId = context.params.fixedPostId; c

首先,当触发“TotalMoney”节点时,该函数从“OldNewKey”获取一个节点,然后获取另一个节点并进行更新。但这给了我们避免嵌套承诺的警告

exports.postMoneyUpdater = functions.database.ref('/TotalMoney/{fixedPostId}/').onWrite((change, context) => {

     const fixedPostId = context.params.fixedPostId;

     const moneyAmountBefore = change.before.val();
     const moneyAmountAfter = change.after.val();
     var oldPostKey;
     // console.log("time "+ Date.now());

     if(moneyAmountAfter>moneyAmountBefore){

         const oldNewKeyRef = admin.database().ref(`/OldNewKey`).child(fixedPostId);

          return oldNewKeyRef.once('value').then((oldNewKeySnapshot)=>{

              if(!oldNewKeySnapshot.exists()){
                   oldPostKey = fixedPostId;
              }else{
                   oldPostKey = oldNewKeySnapshot.val();
              } 

             const postRef = admin.database().ref(`/Posts`).child(oldPostKey);

              return postRef.once('value').then((postSnapshot)=>{

                  var postMap ={};

                  postSnapshot.forEach((child) =>{
                     postMap[child.key] = child.val();
                    });

                  const newPostKey = 9999999999999-Date.now();

                  var updateMap = {};
                  updateMap["post"] = postMap["post"];
                  updateMap["imageUrl"] = postMap["imageUrl"];
                  updateMap["userId"] = postMap["userId"];
                  updateMap["postId"] = postMap["postId"];
                  updateMap["dist"] = postMap["dist"];
                  updateMap["customId"] = postMap["customId"];
                  updateMap["newPostKey"] = newPostKey.toString();;
                  updateMap["money"] = moneyAmountAfter;

                  var writeMap = {};

                   writeMap['/Posts/'+oldPostKey] = null;
                   writeMap['/Locality/'+postMap["dist"]+'/'+oldPostKey] = null;

                   writeMap['/Posts/'+newPostKey] = updateMap;
                   writeMap['/Locality/'+postMap["dist"]+'/'+newPostKey] = updateMap;
                   writeMap['/MyPosts/'+fixedPostId] = updateMap;
                   writeMap['/OldNewKey/'+fixedPostId] = newPostKey.toString();;

                   return admin.database().ref().update(writeMap);

              });

          });

     }else{
         return null;
     }

 });

以下各项应正常(但未测试!)


我认为这个答案很有效。谢谢你的回复。经过一段时间的反复试验,我也能解决我的问题。下面是经过一些修改和附加功能的代码-
exports.postMoneyUpdater = functions.database
  .ref('/TotalMoney/{fixedPostId}/')
  .onWrite((change, context) => {
    const fixedPostId = context.params.fixedPostId;

    const moneyAmountBefore = change.before.val();
    const moneyAmountAfter = change.after.val();
    var oldPostKey;
    // console.log("time "+ Date.now());

    if (moneyAmountAfter > moneyAmountBefore) {
      const oldNewKeyRef = admin
        .database()
        .ref(`/OldNewKey`)
        .child(fixedPostId);

      return oldNewKeyRef
        .once('value')
        .then(oldNewKeySnapshot => {
          if (!oldNewKeySnapshot.exists()) {
            oldPostKey = fixedPostId;
          } else {
            oldPostKey = oldNewKeySnapshot.val();
          }

          const postRef = admin
            .database()
            .ref(`/Posts`)
            .child(oldPostKey);

          return postRef.once('value');
        })
        .then(postSnapshot => {
          var postMap = {};

          postSnapshot.forEach(child => {
            postMap[child.key] = child.val();
          });

          const newPostKey = 9999999999999 - Date.now();

          var updateMap = {};
          updateMap['post'] = postMap['post'];
          updateMap['imageUrl'] = postMap['imageUrl'];
          updateMap['userId'] = postMap['userId'];
          updateMap['postId'] = postMap['postId'];
          updateMap['dist'] = postMap['dist'];
          updateMap['customId'] = postMap['customId'];
          updateMap['newPostKey'] = newPostKey.toString();
          updateMap['money'] = moneyAmountAfter;

          var writeMap = {};

          writeMap['/Posts/' + oldPostKey] = null;
          writeMap['/Locality/' + postMap['dist'] + '/' + oldPostKey] = null;

          writeMap['/Posts/' + newPostKey] = updateMap;
          writeMap[
            '/Locality/' + postMap['dist'] + '/' + newPostKey
          ] = updateMap;
          writeMap['/MyPosts/' + fixedPostId] = updateMap;
          writeMap['/OldNewKey/' + fixedPostId] = newPostKey.toString();

          return admin
            .database()
            .ref()
            .update(writeMap);
        });
    } else {
      return null;
    }
  });