社交互动:产品可以提供用户之间的联动, 使用户之间更有互动感,也可以增加产品的辐射。
const login = async() { const { code, errMsg } = await wx.login(); // 通过接口服务端调用微信服务端接口获取用户标识,获取用户信息 const user = await loginFunc(code); }自动刷新Token
/** * 匹配状态码 * @param response * @param statusCode */ const matchStatusCode = (response, statusCode) => { return [response.status, response.data.code].includes(statusCode); }; /** * 堆代码 duidaima.com * 是否需要重试接口 * @param error * @param updateConfig */ const whetherToRetry = async (error, updateConfig) => { const { user } = rootStore; // 全局变量 if ( !matchStatusCode(error?.response, 401) || // 去除401以外的错误 user.isLogout || // 用户主动退出登录 error?.config?.meta?.reTry === false // 某些特殊场景不需要刷新token ) return false; await resetUser(); // 重置用户信息(重新获取token) if (!user.token) return false; // 获取新token失败则中断 updateConfig({ // 更新token后重试接口 headers: { Authorization: `Bearer ${user.token}`, }, }); return true; } /** * 重置用户 */ const resetUser = async () => { const { user, common } = rootStore; if (user.isLogin) { await user.refreshToken(); } else { await silentLogin(); // 静默登录 } };现在就完成了第一步,自动刷新了Token。
/** * 重置用户 */ const resetUser = async () => { const { user, common } = rootStore; if (!user.userInited) return new Promise((resolve) => { common.setRequestQueue([...common.requestQueue, resolve]); }); user.setUserInited(false); if (user.isLogin) { await user.refreshToken(); } else { await silentLogin(); } user.setUserInited(true); }; constructor() { reaction( () => this.userInited, (arg) => { if (arg) { const { common } = rootStore; common.requestQueue.forEach((item) => item()); // 执行等待队列 common.setRequestQueue([]); } } ); }前置等待用户信息完成
/** * 等待初始化用户结束 */ const waitForUserInited = async () => { const { user, common } = rootStore; if (user.userInited) return Promise.resolve(); // 未初始化则将请求阻塞在队列中 return new Promise((resolve) => { common.setRequestQueue([...common.requestQueue, resolve]); }); }; http.tap('request', async (config) => { const { user } = rootStore; // 需要授权接口 if (!NO_AUTH_URL.includes(config.rawURL)) { await waitForUserInited(); config.headers.Authorization = `Bearer ${rootStore.user.token}`; } // .... }总结