简体   繁体   English

为什么这个异步 function 被调用两次

[英]Why is this asynchronous function being called twice

I am trying to create a user with email and password using firebase, but when I call the function that creates it, it is called twice and I get an error because I am trying to register the email that is already in use. I am trying to create a user with email and password using firebase, but when I call the function that creates it, it is called twice and I get an error because I am trying to register the email that is already in use.

I noticed that the console.log('CALLED') is called once, I don't understand why RegisterWithEmail is called twice.我注意到console.log('CALLED')被调用了一次,我不明白为什么RegisterWithEmail被调用了两次。 My auth flow only creates the userDocument in the confirmation phase, for this reason userSnap.length equals zero in the second call and tries to create again.我的身份验证流程仅在确认阶段创建userDocument ,因此userSnap.length在第二次调用中等于零并尝试再次创建。

How can I call this function once?我怎样才能调用这个 function 一次?

FILE: emailconfirm.page.tsx文件: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 })
    })
  }

FILE: firebase.utils.tsx文件:firebase.utils.tsx

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'
    }
  }
}

Developer console:开发者控制台: 在此处输入图像描述

You shouldn't be mixing and matching .then() s in async functions for your own sanity's sake.为了您自己的理智,您不应该在async函数中混合和匹配.then()

Something like就像是

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 ...
  }
};

might work better for you.可能对你更好。

I need more code to be sure, but I think you should add await我需要更多代码才能确定,但我认为你应该添加await

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM