js同步代码中没有执行try/catch代码?

作者站长头像
站长
· 阅读数 8
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代码?不知道是什么原因?js同步代码中没有执行try/catch代码?

回复
1个回答
avatar
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,也是异步程序的“同步写法”,而不是同步。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容