js同步代码中没有执行try/catch代码?-灵析社区

无敌奥特MEN

let isRefreshToken = false const request = (url:string, method:string, data?:any) => { return new Promise(async (resolve, reject) => { if (isRefreshToken) return // 判断token超时,刷新token if (Store.getters.expiresTime && new Date().getTime() >= Store.getters.expiresTime) { await refreshData() return } ... } const refreshData = async () => { if (!isRefreshToken) { isRefreshToken = true if (!Store.getters.referToken) { cleanData() isRefreshToken = false } else { console.log(123); try { let res = await refreshToken(Store.getters.referToken) Store.dispatch('SaveInfo', res) isRefreshToken = false uni.switchTab({ url: '/pages/device/index' }) } catch (error) { cleanData() } console.log(333); } } } 打印结果: 打印走到了else中,输出了123。但是没有走trycatch代码?不知道是什么原因? ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241009/3e63d33f9836d8558c06a1daa273be92.png)

阅读量:148

点赞量:0

问AI
通常情况下不会在 "new Promise()" 里用 "async" 函数。如果想用 "await",可以不用 "new Promise()" 直接把外层函数定义为 "async" 函数,比如 const request = async (url: string, method: string, data?: any) => { // ^^^^^ 声明为 async 函数 if (isRefreshToken) return // 判断token超时,刷新token if (Store.getters.expiresTime && new Date().getTime() >= Store.getters.expiresTime) { await refreshData() // ^^^^^^^^^^^^^^^^^^^ 这里如果发生错误,会 reject 穿透出去 return } } 既然用的 TypeScript,会发现 "request" 的返回类型是 "Promise",和 "return new Promise(...)" 的返回类型是一致的。如果确实要用 Promise 对象,应该这样 let isRefreshToken = false const request = (url: string, method: string, data?: any): Promise => { return new Promise((resolve, reject) => { // ^^^ 不要 async,内部也不要用 await(不赞成 await 和回调混用) if (isRefreshToken) return // 判断token超时,刷新token if (Store.getters.expiresTime && new Date().getTime() >= Store.getters.expiresTime) { refreshData().then(resolve, reject); // ^^^^^^^^^^^^^^^^^^^^^^ 将 refreshData 的运行和 resolve, reject 绑定起来 return } }); } const refreshData = async () => { } 所以两种方式,一种是直接定义 async 函数,另一种是在 new Promise() 里正确调用 resolve 和 reject。 顺便说一下,这不是“同步”,是异步。就算是用 await,也是异步程序的“同步写法”,而不是同步。