From 3556d288325a1d8ecf43f896ac32b14dcec67ccd Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Fri, 9 Jul 2021 16:28:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E5=B8=A6?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=9B=91=E5=90=AC=E7=9A=84=20buildRegFnWithE?= =?UTF-8?q?vent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用于处理在get过后再set的时序问题 --- shared/api/request.ts | 6 +++++- shared/manager/buildRegFn.ts | 23 ++++++++++++++++++++++- shared/manager/service.ts | 11 ++++++----- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/shared/api/request.ts b/shared/api/request.ts index 9f2de754..65d0cc9a 100644 --- a/shared/api/request.ts +++ b/shared/api/request.ts @@ -4,7 +4,7 @@ import _isString from 'lodash/isString'; import _isNil from 'lodash/isNil'; import _isFunction from 'lodash/isFunction'; import { getErrorHook, tokenGetter } from '../manager/request'; -import { getServiceUrl } from '../manager/service'; +import { getServiceUrl, onServiceUrlChange } from '../manager/service'; export type CommonRequestResult = | ({ @@ -24,6 +24,10 @@ export function createRequest() { const ins = axios.create({ baseURL: getServiceUrl(), }); + onServiceUrlChange((getUrl) => { + // 重置请求地址 + ins.defaults.baseURL = getUrl(); + }); ins.interceptors.request.use(async (val) => { if ( diff --git a/shared/manager/buildRegFn.ts b/shared/manager/buildRegFn.ts index 911c3cd2..cacc929a 100644 --- a/shared/manager/buildRegFn.ts +++ b/shared/manager/buildRegFn.ts @@ -1,10 +1,10 @@ import _isFunction from 'lodash/isFunction'; import _isEqual from 'lodash/isEqual'; + /** * 构建一对get set 方法 * 用于在不同平台拥有统一方式调用体验 */ - export function buildRegFn any>( name: string, defaultFunc?: F @@ -29,6 +29,27 @@ export function buildRegFn any>( return [get, set] as const; } +/** + * 构建带事件监听的get set 方法 + */ +export function buildRegFnWithEvent any>( + name: string, + defaultFunc?: F +) { + const [get, _set] = buildRegFn(name, defaultFunc); + const listenerList: ((v: F) => void)[] = []; + const onSet = (cb: (v: F) => void): void => { + listenerList.push(cb); + }; + + const set = (fn: F): void => { + _set(fn); + listenerList.forEach((listener) => listener(fn)); + }; + + return [get, set, onSet] as const; +} + /** * 缓存版本的buildRegFn */ diff --git a/shared/manager/service.ts b/shared/manager/service.ts index 6f2e74fa..61604e0b 100644 --- a/shared/manager/service.ts +++ b/shared/manager/service.ts @@ -1,9 +1,10 @@ -import { buildRegFn } from './buildRegFn'; +import { buildRegFnWithEvent } from './buildRegFn'; /** * 获取服务器地址相关逻辑 */ -export const [getServiceUrl, setServiceUrl] = buildRegFn<() => string>( - 'serverUrl', - () => 'http://127.0.0.1:11000' -); +export const [getServiceUrl, setServiceUrl, onServiceUrlChange] = + buildRegFnWithEvent<() => string>( + 'serverUrl', + () => 'http://127.0.0.1:11000' + );