用户输入错误密码时如何阻止导航跳转?捕获错误仍重定向问题求助
核心问题根因
- 代码中的跳转逻辑写在函数的同步执行末尾,而
firebase.auth().signInWithEmailAndPassword是返回Promise的异步方法,不会阻塞后续同步代码的执行。函数调用时,同步执行流会在注册完Promise回调后,立刻走到末尾的this.props.navigation.replace('Home')执行跳转,完全不等异步登录流程返回结果,这就是输错密码依然会强制跳首页的根本原因。 - 外层包裹的同步
try/catch无法捕获异步Promise抛出的错误。异步方法的错误是在后续微任务执行阶段才会抛出的,不属于当前同步执行上下文的同步抛出错误,因此catch块永远不会被触发,里面的错误打印、判断、return逻辑自然完全不生效。 - 代码中
if(error===true)的判断逻辑存在本质缺陷:就算catch块真的捕获到错误,拿到的也是Error类实例,永远不会严格等于布尔值true,这个判断恒为false,对应的终止逻辑永远不会执行。
可正常运行的修复代码
将跳转逻辑绑定到登录成功的分支内,错误捕获通过Promise自带的.catch()链路实现,修改后的代码如下:
login = (email, password) => { firebase.auth().signInWithEmailAndPassword(email, password) .then((userCredential) => { // 仅当登录流程校验通过、获取到有效用户凭证时,才执行跳转 console.log(userCredential.user) this.props.navigation.replace('Home') }) .catch((error) => { // 所有登录失败场景(密码错误、账号不存在、网络异常等)都会进入该分支 console.log(error.toString()) // 可在此处添加错误提示,告知用户输入信息异常 // 该分支内不会执行任何跳转逻辑 }) }
后续开发注意事项
- 处理基于Promise的异步接口错误时,不要混用同步
try/catch逻辑,必须通过Promise链的.catch()方法捕获错误,否则会出现错误捕获完全失效的问题。 - 涉及鉴权后的跳转操作,必须和接口的返回状态做强绑定,不能放在函数同步执行流的末尾,避免出现无论鉴权结果如何都强制跳转的问题。
内容的提问来源于stack exchange,提问作者MuhammadShahbaz
相关产品推荐
相关产品推荐

