React中verifyPassword前await的使用困惑及问题咨询
问题原因分析与解决
核心问题:toast.promise 需要未完成的 Promise
你遇到的问题本质是对 toast.promise 的工作逻辑理解偏差:
toast.promise的核心作用是监听一个未完成的 Promise 的状态变化(pending/resolved/rejected),从而自动切换加载、成功、错误提示。- 当你在
verifyPassword前加await时,代码会等待这个 Promise 执行完成,此时loginPromise已经变成了 Promise 解析后的结果(即{ data: ... }对象),不再是 Promise 本身。把这个结果传给toast.promise,它无法识别状态变化,自然会一直停留在加载提示。 - 去掉
await后,loginPromise就是verifyPassword返回的未完成的 Promise,toast.promise能正常监听它的状态流转,加载提示会在 Promise 完成后自动切换。
代码细节拆解
加 await 的错误场景
// 这里 await 会等待 verifyPassword 执行完毕,loginPromise 变成解析后的结果(非Promise) let loginPromise = await verifyPassword({ username, password: values.password }); // 传入非Promise值,toast无法监听状态,加载提示永久显示 toast.promise(loginPromise, { ... });
去掉 await 的正确场景
// loginPromise 是未完成的Promise对象 let loginPromise = verifyPassword({ username, password: values.password }); // toast监听Promise状态,pending显示"Checking...",完成后自动切换提示 toast.promise(loginPromise, { ... });
对比 verifyOTP 场景的差异
你用 await 调用 verifyOTP 能正常工作,是因为那个场景是手动处理 Promise 结果:
- 先用
await等待 Promise 完成,再根据返回的status手动调用toast.success或toast.error,和toast.promise的自动状态监听逻辑完全不同,所以用await是合理的。
优化代码建议
可以简化代码逻辑,直接把 verifyPassword 的调用传给 toast.promise,并在回调里处理后续跳转逻辑:
onSubmit: (values) => { toast.promise( verifyPassword({ username: username, password: values.password, }), { loading: "Checking...", success: (res) => { localStorage.setItem("token", res.data.token); navigate("/profile"); return <b>Login successfully...</b>; }, error: <b>Incorrect Password</b>, } ); },
内容的提问来源于stack exchange,提问作者Rishit Parmar
相关产品推荐
相关产品推荐

