35 条回复  ·  3808 次点击
supuwoerc 楼主 小成 2025-9-4 10:54:44
@canvascat 你的这个实际上也是一种锁,还是会有楼上的时序问题~
NotLongNil 初学 2025-9-4 11:05:02
这段代码一堆 if ,看得好难受
bli22ard 小成 2025-9-4 11:11:52
js 单线程没有并发读写问题,js 的 io 都是异步的,只有开了异步后,异步唤醒后的顺序问题。在执行 if (!isRefreshing) { isRefreshing = true; } 这个过程中,不会有其他线程来竞争, 但是如果你执行了 settimeout setinterval 或者 ajax 等异步,那就会去检查其他事件是否就绪,然后执行其他的地方。
leoskey 小成 2025-9-4 11:20:13
在多个请求响应时间不同的情况下,可能会出现重复刷新 token 。 例如,A 请求响应时间 100ms ,B 请求响应时间 300ms 。 A 请求响应 token 过期,在 100ms 内完成: isRefreshing = true , 执行 refresh 流程,isRefreshing = false 。 此时才过去 200ms 。 再过 100ms 后,B 请求响应 token 过期,发现 isRefreshing = false ,再次执行 refresh 。 试试双重检查: 1. 如果是 JWT ,先检查本地 token 是否过期 2. 如果服务器响应 token 无效 3. 再检查一次本地 token 是否与上次相同,不相同说明刷新过了,相同就执行 refresh
shintendo 小成 2025-9-4 11:29:50
用一个 outdatedToken 变量代替 isRefreshing if (!isRefreshing){ isRefreshing = true } 换成 if(outdatedToken !== config.token) { outdatedToken = config.token } 去掉 isRefreshing = false 的操作 其它不变
GGbeng1 初学 2025-9-4 11:49:50
还有一种方法,过期时将所有请求地址记录;同时 cancel 掉所有请求;刷新后从新发送或者直接刷新页面😂
1234
返回顶部