js同步代码中没有执行try/catch代码?
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代码?不知道是什么原因?
回复
1个回答
test
2024-06-23
通常情况下不会在 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<unknown>
,和 return new Promise(...)
的返回类型是一致的。如果确实要用 Promise 对象,应该这样
let isRefreshToken = false
const request = (url: string, method: string, data?: any): Promise<unknown> => {
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,也是异步程序的“同步写法”,而不是同步。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容