Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.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 为什么这个异步函数被调用了两次_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 为什么这个异步函数被调用了两次

Javascript 为什么这个异步函数被调用了两次,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我试图使用firebase创建一个具有电子邮件和密码的用户,但当我调用创建该用户的函数时,该函数被调用了两次,我收到一个错误,因为我试图注册已在使用的电子邮件 我注意到console.log('CALLED')被调用了一次,我不明白为什么RegisterWithEmail被调用了两次。My auth flow仅在确认阶段创建userDocument,因此userSnap.length在第二次调用中等于零,并尝试再次创建 如何调用此函数一次? 文件:emailconfirm.page.tsx re

我试图使用firebase创建一个具有电子邮件和密码的用户,但当我调用创建该用户的函数时,该函数被调用了两次,我收到一个错误,因为我试图注册已在使用的电子邮件

我注意到console.log('CALLED')被调用了一次,我不明白为什么RegisterWithEmail被调用了两次。My auth flow仅在确认阶段创建userDocument,因此userSnap.length在第二次调用中等于零,并尝试再次创建

如何调用此函数一次?

文件:emailconfirm.page.tsx

registerEmail = async data => {
    const { setRegStatus, createDoc } = this.props;
    console.log('CALLED')
    await RegisterWithEmail(data).then(res => {
      console.log('Final response ', res)
      if(res === 'EMAIL_VERIFIED') {
        createDoc()
        setRegStatus({ status: 'created', data: res })
      }
      else if(res === 'SOMETHING_WENT_WRONG'){
        setRegStatus({ status: 'error', data: res })
      }

    }).catch(err => {
      console.log('Error ', err)
      setRegStatus({ status: 'error', data: err })
    })
  }
export const RegisterWithEmail = async user => {
  console.log("Called Once...");

  if(!user) return 'SOMETHING_WENT_WRONG';
  else {
    const snap = await firestore.collection('users').where('email', '==', user.email).get();
    const docs = snap.docs.map((doc) => doc.data());

    if (docs.length !== 0) return 'EMAIL_HAS_ALREADY_BEEN_TAKEN';

    try {
      console.log("Trying to register email...");
      return await auth.createUserWithEmailAndPassword(user.email, user.password).then(async usr => {
        await usr.user.updateProfile({
          displayName: user.name
        }) // SETTING NAME

        const sendVerifyEmail = usr.user.sendEmailVerification().then(() => setTimer(usr.user, 5))

        return await sendVerifyEmail.then(msg => {
          console.log('Finishing...', msg)
          if(msg.txt !== 'waiting') {
            if(msg.error) {
              throw msg.txt
            }
            else return msg.txt
          }
        }).catch(() => {
          throw 'EMAIL_NOT_SENT'
        })
      }).catch(() => {
        throw 'USER_NOT_CREATED'
      })
    } catch (err) {
      throw 'USER_ALREADY_REGISTERED'
    }
  }
}
文件:firebase.utils.tsx

registerEmail = async data => {
    const { setRegStatus, createDoc } = this.props;
    console.log('CALLED')
    await RegisterWithEmail(data).then(res => {
      console.log('Final response ', res)
      if(res === 'EMAIL_VERIFIED') {
        createDoc()
        setRegStatus({ status: 'created', data: res })
      }
      else if(res === 'SOMETHING_WENT_WRONG'){
        setRegStatus({ status: 'error', data: res })
      }

    }).catch(err => {
      console.log('Error ', err)
      setRegStatus({ status: 'error', data: err })
    })
  }
export const RegisterWithEmail = async user => {
  console.log("Called Once...");

  if(!user) return 'SOMETHING_WENT_WRONG';
  else {
    const snap = await firestore.collection('users').where('email', '==', user.email).get();
    const docs = snap.docs.map((doc) => doc.data());

    if (docs.length !== 0) return 'EMAIL_HAS_ALREADY_BEEN_TAKEN';

    try {
      console.log("Trying to register email...");
      return await auth.createUserWithEmailAndPassword(user.email, user.password).then(async usr => {
        await usr.user.updateProfile({
          displayName: user.name
        }) // SETTING NAME

        const sendVerifyEmail = usr.user.sendEmailVerification().then(() => setTimer(usr.user, 5))

        return await sendVerifyEmail.then(msg => {
          console.log('Finishing...', msg)
          if(msg.txt !== 'waiting') {
            if(msg.error) {
              throw msg.txt
            }
            else return msg.txt
          }
        }).catch(() => {
          throw 'EMAIL_NOT_SENT'
        })
      }).catch(() => {
        throw 'USER_NOT_CREATED'
      })
    } catch (err) {
      throw 'USER_ALREADY_REGISTERED'
    }
  }
}
开发者控制台:
为了您自己的理智,您不应该在
异步
函数中混用和匹配
。然后()

差不多

export const RegisterWithEmail = async (user) => {
  if (!user) return false;
  const snap = await firestore.collection("users").where("email", "==", user.email).get();
  const docs = snap.docs.map((doc) => doc.data());
  if (docs.length !== 0) return false;
  console.log("Trying to register email...");
  try {
    const resp = await auth.createUserWithEmailAndPassword(user.email, user.password);
    // then ...
    return true;
  } catch (err) {
    // catch ...
  }
};

可能更适合您。

我需要更多的代码来确定,但我认为您应该添加
wait

registerEmail = async data => {
    console.log('CALLED')
    await RegisterWithEmail(data)
}

我试过这个和@akx技巧,但都没用。