客户端须要不按期更新token,同时得保证在发送更新token同时其余网络请求挂起,不然会报token失效。待新token回来以后,从新发起挂起的请求。应服务端要求,更新token请求时,老token马上失效数组
let token = 1 当前请求使用的token let refreshToken = false // 是否处于更新token中 let subscribers = []; // 挂起的请求数组 /** * 网络请求入口 */ function callApi (data, time = 1000) { console.log('0000callApi=== type:' + data.type + ' token:' + token) if (refreshToken) { const retryOriginalRequest = new Promise((resolve) => { addSubscriber(()=> { resolve(request(time, data.type)) }) }); return retryOriginalRequest; } // 判断是不是执行更新token if (data && (data.type == 'refreshToken')) { const newData = request(time, data.type) refreshToken = true return newData } return request(time, data.type) } /** * 执行网络请求 */ function request(ms, type) { console.log('1111request=== type:' + type + ' token:' + token) return new Promise((resolve, reject) => { setTimeout(resolve, ms, type); }); } /** * token更新后,从新发起挂起的请求 */ function onAccessTokenFetched() { subscribers.forEach((callback)=>{ console.log('从新请求') callback(); }) refreshToken = false subscribers = []; } /** * push挂起的请求 * @param callback 挂起的请求 */ function addSubscriber(callback) { subscribers.push(callback) }
// before callApi({type: 'first', token}, 1000).then(consoleResponse) // Todo callApi({type: 'refreshToken', token}, 2000).then((v) => { token = 2 onAccessTokenFetched() consoleResponse(v) }) // doing callApi({type: 'second', token}, 2000).then(consoleResponse) callApi({type: 'third', token}, 2000).then(consoleResponse) callApi({type: 'four', token}, 2000).then(consoleResponse) callApi({type: 'five', token}, 2000).then(consoleResponse) // after setTimeout(() => callApi({type: 'six', token}, 2000).then(consoleResponse), 5000) function consoleResponse (v) { console.log('2222response===type:' + v + ' token:' + token) }
"0000callApi=== type:first token:1" "1111request=== type:first token:1" "0000callApi=== type:refreshToken token:1" "1111request=== type:refreshToken token:1" "0000callApi=== type:second token:1" "0000callApi=== type:third token:1" "0000callApi=== type:four token:1" "0000callApi=== type:five token:1" "2222response===type:first token:1" "从新请求" "1111request=== type:second token:2" "从新请求" "1111request=== type:third token:2" "从新请求" "1111request=== type:four token:2" "从新请求" "1111request=== type:five token:2" "2222response===type:refreshToken token:2" "2222response===type:second token:2" "2222response===type:third token:2" "2222response===type:four token:2" "2222response===type:five token:2" "0000callApi=== type:six token:2" "1111request=== type:six token:2" "2222response===type:six token:2"