Javascript 运行Firebase Firestore事务,包括异步反应本机函数中的循环
我正在尝试获取一个用户ID队列;然后,通过顺序获取前2个用户ID的数据并检查它们是否符合条件,将前2个用户ID添加到数组中 下面的函数为我提供6个用于调试的警报,提示事务继续重新运行。如果没有调试警报,错误消息为“firestore/无效参数”。调试确认正在正确创建阵列(toArray) 当我注释掉for循环并将一个userId推入数组(toArray)时,事务运行得非常好。您可以在下面的代码中看到这些努力。我认为循环中的wait transaction.get()导致了问题,但不知道如何解决 该领域的任何专业知识或解决方案想法都会对我大有帮助。我也在网上寻找资源,但找不到任何与我的情况相关的东西。提前谢谢Javascript 运行Firebase Firestore事务,包括异步反应本机函数中的循环,javascript,react-native,transactions,google-cloud-firestore,react-native-firebase,Javascript,React Native,Transactions,Google Cloud Firestore,React Native Firebase,我正在尝试获取一个用户ID队列;然后,通过顺序获取前2个用户ID的数据并检查它们是否符合条件,将前2个用户ID添加到数组中 下面的函数为我提供6个用于调试的警报,提示事务继续重新运行。如果没有调试警报,错误消息为“firestore/无效参数”。调试确认正在正确创建阵列(toArray) 当我注释掉for循环并将一个userId推入数组(toArray)时,事务运行得非常好。您可以在下面的代码中看到这些努力。我认为循环中的wait transaction.get()导致了问题,但不知道如何解决
send = () => {
const messagesRef = firebase.firestore().collection('messages');
const messageStatsDoc = messagesRef.doc('--stats--');
const messageRefDoc = messagesRef.doc();
const usersRef = firebase.firestore().collection('users');
const reach = 2;
const { kindtag, message, currentUser } = this.state;
if (kindtag == 'Select kindtag') {
return alert("No kindtag selected");
};
const updateFunction = async transaction => {
const mStatsDoc = await transaction.get(messageStatsDoc);
let currentQueue = mStatsDoc.data().queue;
let toArray = [];
let outputs = ''; // for debug
outputs = outputs + "," + currentQueue.length; // for debug
for (let j = 0; j < currentQueue.length; j++) {
let queuedUserID = currentQueue[j];
if (queuedUserID != currentUser.uid) {
let qUserRef = usersRef.doc(queuedUserID);
let userQueued = await transaction.get(qUserRef);
let kindtagReceive = userQueued.data().kindtagReceive;
if (kindtagReceive.includes(kindtag)) {
toArray.push(queuedUserID);
if (toArray.length == reach) {
break;
};
};
};
outputs = outputs + "," + j;
};
alert(outputs) // 6 alerts saying ",5,0,1,2" (or 2 seconds)
//toArray.push('XR8pAKia5GZokNeTGGgtzwFY79g1') // comment out loop and uncomment this -> works
//toArray.push('rbdIAi3TZngS2H79iElfjjMqiNl2')
if (toArray.length) {
// restructure queue
toArray.forEach(async toUser => {
await transaction.update(messageStatsDoc, {
queue: firebase.firestore.FieldValue.arrayRemove(toUser)
});
await transaction.update(messageStatsDoc, {
queue: firebase.firestore.FieldValue.arrayUnion(toUser)
});
});
// create message
await transaction.set(messageRefDoc, {
from: currentUser.uid,
to: toArray,
kindtag: kindtag,
message: message,
upVote: 0,
downVote: 0,
messageTime: firebase.firestore.FieldValue.serverTimestamp(),
reports: []
});
} else {
return alert("No match exists")
};
return reach;
};
firebase
.firestore()
.runTransaction(updateFunction)
.then((reach) => {
alert('Message sent to: ' + reach);
})
.catch(error => {
alert(error);
});
};
send=()=>{
const messagesRef=firebase.firestore().collection('messages');
const messageStatsDoc=messagesRef.doc('--stats--');
const messageRefDoc=messagesRef.doc();
const usersRef=firebase.firestore().collection('users');
常数范围=2;
const{kindtag,message,currentUser}=this.state;
如果(kindtag==“选择kindtag”){
返回警报(“未选择kindtag”);
};
const updateFunction=异步事务=>{
const mStatsDoc=wait transaction.get(messageStatsDoc);
让currentQueue=mStatsDoc.data().queue;
让toArray=[];
让输出=“”;//用于调试
输出=输出+”,“+currentQueue.length;//用于调试
for(设j=0;j有效
//toArray.push('rbdIAi3TZngS2H79iElfjjMqiNl2')
如果(到阵列长度){
//重组队列
toArray.forEach(异步toUser=>{
等待事务。更新(messageStatsDoc{
队列:firebase.firestore.FieldValue.arrayRemove(toUser)
});
等待事务。更新(messageStatsDoc{
队列:firebase.firestore.FieldValue.arrayUnion(toUser)
});
});
//创建消息
wait transaction.set(messageRefDoc{
发件人:currentUser.uid,
致:今天,
kindtag:kindtag,
讯息:讯息,,
投票:0,
反对票:0,
messageTime:firebase.firestore.FieldValue.serverTimestamp(),
报告:[]
});
}否则{
返回警报(“不存在匹配项”)
};
回程;
};
火基
.firestore()
.runTransaction(updateFunction)
.然后((到达)=>{
警报(“消息发送至:”+reach);
})
.catch(错误=>{
警报(错误);
});
};