reactjs - 反应具有许多回报的 Firebase 云功能
问题描述
有什么方法可以updateQuestions
在 foreach + ref 中设置我的变量?或者我必须做两个不同的云功能?我想返回一个巨大的更新updateQuestions
,但我需要从基于 firebase 数据的 foreach 中返回数据..
这是我的功能:
exports.deleteQuestion = functions.database.ref('questions_for_mars/{pushId}').onDelete(event => {
const original = event.val()
idQuestion = event.key
authorQuestion = original.author
//console.log('event', original.answers)
return admin.database().ref('counter/questions_active').once('value').then((snapshot) => {
var questions_active = snapshot.val()
var updateQuestions = {};
updateQuestions['/counter/questions_active'] = questions_active - 1
updateQuestions['/my_questions/' + authorQuestion + '/' + idQuestion] = null
updateQuestions['/my_questions_send/' + authorQuestion + '/' + idQuestion] = null
updateQuestions['/questions/' + idQuestion] = null
//updateQuestions['/my_answers/' + authorQuestion + '/' + idQuestion] = null
event.child('answers').forEach(child => {
var mars = child.key
return admin.database().ref('/mars/' + mars + '/counter/answers_active').once('value').then((snapshot) => {
var answers_active = snapshot.val()
updateQuestions['/my_answers/' + mars + '/' + idQuestion] = null
updateQuestions['/mars/' + mars + '/counter/answers_active'] = answers_active - 1
});
console.log('TOTO', updateQuestions)
});
console.log('UPDAYE', updateQuestions)
return admin.database().ref().update(updateQuestions)
})
});
解决方案
您似乎使用的是旧版本的 Firebase SDK for Cloud Functions,请参阅https://firebase.google.com/docs/functions/beta-v1-diff。您绝对应该更新它(请参阅本文档中的说明)。
然后,对于您的event.child('answers').forEach(child => {})
循环,您需要使用Promise.all()
来管理对数据库的并行异步查询。
您将以Promise.all()
与查询数组相同的顺序在对应于履行值的数组中收到结果。
所以下面的代码应该可以解决问题(未经测试):
exports.deleteQuestion = functions.database.ref('questions_for_mars/{pushId}').onDelete((snapshot, context) => {
const original = snapshot.val()
idQuestion = snapshot.key
authorQuestion = original.author
//console.log('event', original.answers)
var updateQuestions = {};
return admin.database().ref('counter/questions_active').once('value')
.then((snapshot) => {
var questions_active = snapshot.val();
updateQuestions['/counter/questions_active'] = questions_active - 1
updateQuestions['/my_questions/' + authorQuestion + '/' + idQuestion] = null
updateQuestions['/my_questions_send/' + authorQuestion + '/' + idQuestion] = null
updateQuestions['/questions/' + idQuestion] = null
//updateQuestions['/my_answers/' + authorQuestion + '/' + idQuestion] = null
var queries = [];
snapshot.child('answers').forEach(child => {
var mars = child.key
queries.push(admin.database().ref('/mars/' + mars + '/counter/answers_active').once('value'))
});
return Promise.all(queries);
})
.then(results => {
results.forEach(snapshot => {
var answers_active = snapshot.val()
//Here you need to extract the value of mars from snapshot.key
//I let you do this piece of code!!
updateQuestions['/my_answers/' + mars + '/' + idQuestion] = null
updateQuestions['/mars/' + mars + '/counter/answers_active'] = answers_active - 1
});
return admin.database().ref().update(updateQuestions)
});
})
推荐阅读
- arrays - 使用聚合向记录添加值
- symfony - 找不到对应的 Doctrine 对象
- sap-cloud-sdk - 如何在 SAP Cloud SDK 3.0 及更高版本中获取用户信息和权限
- ios - CBCentralManager,didConnect 外围设备:永远不会被调用
- uitextfield - Swiftui TextField onkeypress
- excel - VBA中的函数给我素数不起作用
- apache-kafka - 动物园管理员卡夫卡
- javascript - 想在按回车但重新加载时发送消息
- javascript - 为什么控制台显示typeError?
- wordpress - 如何从 Wordpress API 获取数据?