You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中Axios请求设置状态后执行操作存在延迟问题

问题分析与修复方案

问题根源

你的login函数虽然标记为async,但内部调用axios.post时用了.then()/.catch()却没有等待这个异步操作完成——login函数在执行完csrf()和初始状态更新后就直接返回了,完全没等登录请求结束。

这就导致submitForm里的await login(...)提前执行完毕,finally块立刻把loading设为false,加载动画先停了,但此时登录请求其实还在后台跑,后续的登录成功回调(mutate())或错误提示(setErrors)要等请求真正走完才触发,所以看起来延迟了2秒。

修复代码

有两种写法可以解决这个问题:

写法一:改用await+try/catch(推荐)

const login = async ({ setErrors, setStatus, ...props }) => {
    await csrf()

    setErrors([])
    setStatus(null)

    try {
        // 等待axios请求完成
        await axios.post('/login', props)
        mutate()
    } catch (error) {
        if (error.response.status !== 422) throw error
        setErrors(error.response.data.errors)
    }
}

写法二:返回axios的Promise

如果想保留.then()/.catch()的写法,只需把axios请求的Promise返回出去,让await login(...)能等待它完成:

const login = async ({ setErrors, setStatus, ...props }) => {
    await csrf()

    setErrors([])
    setStatus(null)

    // 返回Promise,让外层await能等待请求结束
    return axios
        .post('/login', props)
        .then(() => mutate())
        .catch(error => {
            if (error.response.status !== 422) throw error
            setErrors(error.response.data.errors)
        })
}

效果说明

修复后,submitForm里的await login(...)会真正等待登录请求完成,finally块里的setLoading(false)会在登录请求结束后才执行——加载动画会持续到登录成功/失败的状态更新完成,不会再出现动画停了但后续操作延迟的情况。

内容的提问来源于stack exchange,提问作者BigJobbies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:41:13