2

我有一个函数handleSubmit可以在反应组件中处理在 Firebase 中的注册。在里面,我想用我的setErrorTimeout函数处理错误,在这种情况下,它有一个 setTimeout 会在 3 秒后自动重置错误。

问题是,我的超时未执行,例如超时内的回调函数在 3 秒后未执行,但其他一切都是.. 为什么?

    const handleSubmit = async e => {
    e.preventDefault()

    console.log(formDetails)
 
    if (formDetails.password !== formDetails.passwordrepeat) {
        setErrorTimeout(setRegisterError, {
            message: 'Passwords do not match!',
        })
        return
    }

    console.log('Try')
    console.log(formDetails.email, formDetails.password)
    try {
        auth.createUserWithEmailAndPassword(
            formDetails.email,
            formDetails.password
        )
            .then(userCredentials => {
                if (userCredentials) {
                    const user = userCredentials.user
                    let success = user.sendEmailVerification()
                    console.log('success register:', success)
                    setRegisterSuccess(
                        'You registered successfully! please check your email!'
                    )

                    setFormDetails({})
                }
            })
            .catch(error => {
                console.log('ERROR!')
                setErrorTimeout(error)
            })
    } catch (e) {
        setErrorTimeout(e)
    }
}


const setErrorTimeout = error => {
    console.log('inside timeout!')
    setRegisterError(error)
    const timer = setTimeout(() => {
        console.log('inside cb!')
        setRegisterError(null)
    }, 3000)
    clearTimeout(timer)
    console.log('after timeout!')
}
4

1 回答 1

2

您在此处创建超时后立即清除它:

const timer = setTimeout(() => {
    console.log('inside cb!')
    setRegisterError(null)
}, 3000)
clearTimeout(timer)

您可能希望该clearTimeout调用位于回调内部,尽管它甚至不是严格需要的,因为超时已经触发。

于 2021-09-17T18:52:05.153 回答