Android 如何避免Firebase云函数中的嵌套承诺
首先,当触发“TotalMoney”节点时,该函数从“OldNewKey”获取一个节点,然后获取另一个节点并进行更新。但这给了我们避免嵌套承诺的警告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
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;
}
});