Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行Firebase Firestore事务,包括异步反应本机函数中的循环_Javascript_React Native_Transactions_Google Cloud Firestore_React Native Firebase - Fatal编程技术网

Javascript 运行Firebase Firestore事务,包括异步反应本机函数中的循环

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()导致了问题,但不知道如何解决

我正在尝试获取一个用户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(错误=>{
警报(错误);
});
};