React JS中如何同步执行Promise的then方法完成接口调用
问题根因
执行顺序错乱本质是两个原因:
- 调用
StudentDetail返回的Promise时,没有主动等待Promise状态变更为fulfilled/rejected,JS事件循环会直接往下执行StudentResults里的同步代码,不会等.then回调执行 - 如果
.then回调内部的语句本身也是异步逻辑(比如类组件setState、其他接口请求、定时器),没有主动等待该异步任务完成的话,JS会把这个异步任务丢进任务队列,继续往下执行回调里的后续同步语句,甚至跳出回调执行外层代码,才会出现你说的跳回setStudentResults执行完再回来跑statement2的情况
修复方案
优先用async/await语法处理异步逻辑,代码可读性和顺序可控性远高于嵌套.then链,两步改完即可:
- 修正
StudentHandler.ts的StudentDetail方法,保证内部所有异步逻辑都被等待,Promise状态在所有回调执行完之后再变更:
// StudentHandler.ts async StudentDetail(id: number) { try { const response = await this.studentApi.getStudentDetail(id) // 按执行顺序写回调逻辑,异步语句前必须加await等待执行完成 // 例:如果statement1是异步请求/封装的Promise方法,前面加await await /* 你的statement1逻辑 */ // statement1执行完成后才会跑下面的statement2 /* 你的statement2逻辑 */ return response } catch (error) { console.log(error) throw error // 按需抛出,方便上层捕获异常做提示 } }
如果回调里用到类组件的
setState,要等状态更新完成再执行后续逻辑的话,不要用await等setState(setState本身不返回Promise),直接用setState的第二个回调参数写后续依赖状态的逻辑即可。
- 修正
StudentDetails.tsx里的调用逻辑,等待StudentDetail全流程执行完再跑后续语句:
// StudentDetails.tsx async StudentResults(id: number) { // 加await等待整个接口请求+回调逻辑全部执行完成 await this.StudentHandler.StudentDetail(id) // 以下所有语句会等上面的异步全流程结束后再执行 // statement 1... // statement 2... // 其余业务逻辑 }
如果你不想用async/await,也可以把后续要执行的逻辑全部放到.then的回调链里,但这种写法嵌套深、逻辑复杂后维护成本很高,不推荐。
内容的提问来源于stack exchange,提问作者sunil
相关产品推荐
相关产品推荐

