mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2025-04-06 03:59:53 +08:00
feat: 优化 request,添加 mergeRequest 配置参数
This commit is contained in:
parent
bb2f25f644
commit
8444f64f10
@ -117,6 +117,27 @@ request('/api/login', {
|
|||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### merge 重复请求
|
||||||
|
|
||||||
|
连续发送多个请求,会被合并成一个请求,不会报 `REPEAT` 接口错误。
|
||||||
|
|
||||||
|
当发生 `REPEAT` 请求异常,并且确保自身代码合理的情况下,可以使用该配置。
|
||||||
|
|
||||||
|
```js
|
||||||
|
import {request} from '@fesjs/fes';
|
||||||
|
|
||||||
|
request('/api/login', {
|
||||||
|
username: 'robby',
|
||||||
|
password: '123456'
|
||||||
|
}, {
|
||||||
|
mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求
|
||||||
|
}).then((res) => {
|
||||||
|
// do something
|
||||||
|
}).catch((err) => {
|
||||||
|
// 处理异常
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
### 请求节流
|
### 请求节流
|
||||||
|
|
||||||
```js
|
```js
|
||||||
@ -145,7 +166,7 @@ request('/api/login', {
|
|||||||
}, {
|
}, {
|
||||||
cache: {
|
cache: {
|
||||||
cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
|
cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage
|
||||||
cacheTime: 1000 * 60 * 3 // 缓存时间,默认3min
|
cacheTime: 1000 * 60 * 3 // 缓存时间:默认3min
|
||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
// do something
|
// do something
|
||||||
@ -156,6 +177,7 @@ request('/api/login', {
|
|||||||
|
|
||||||
若 `cache` 传 `true`,则默认使用 `ram` 缓存类型,缓存时间 3min。
|
若 `cache` 传 `true`,则默认使用 `ram` 缓存类型,缓存时间 3min。
|
||||||
|
|
||||||
|
|
||||||
### 结合 use 使用
|
### 结合 use 使用
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
@ -39,7 +39,6 @@ import {
|
|||||||
|
|
||||||
const CACHE_KEY_PREFIX = '__FES_REQUEST_CACHE:';
|
const CACHE_KEY_PREFIX = '__FES_REQUEST_CACHE:';
|
||||||
const CACHE_TYPE = {
|
const CACHE_TYPE = {
|
||||||
merge: 'merge', // merge 重复请求
|
|
||||||
ram: 'ram',
|
ram: 'ram',
|
||||||
session: 'sessionStorage',
|
session: 'sessionStorage',
|
||||||
local: 'localStorage'
|
local: 'localStorage'
|
||||||
@ -64,9 +63,6 @@ function setCacheData({
|
|||||||
data,
|
data,
|
||||||
cacheTime = 1000 * 60 * 3
|
cacheTime = 1000 * 60 * 3
|
||||||
}) {
|
}) {
|
||||||
// merge 类型没有缓存
|
|
||||||
if (cacheType === CACHE_TYPE.merge) return;
|
|
||||||
|
|
||||||
const _key = genInnerKey(key, cacheType);
|
const _key = genInnerKey(key, cacheType);
|
||||||
|
|
||||||
const currentCacheData = {
|
const currentCacheData = {
|
||||||
@ -100,9 +96,6 @@ function isExpire({ expire, cacheTime }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getCacheData({ key, cacheType = 'ram' }) {
|
function getCacheData({ key, cacheType = 'ram' }) {
|
||||||
// merge 类型没有缓存
|
|
||||||
if (cacheType === CACHE_TYPE.merge) return;
|
|
||||||
|
|
||||||
const _key = genInnerKey(key, cacheType);
|
const _key = genInnerKey(key, cacheType);
|
||||||
if (cacheType !== CACHE_TYPE.ram) {
|
if (cacheType !== CACHE_TYPE.ram) {
|
||||||
const cacheInstance = window[CACHE_TYPE[cacheType]];
|
const cacheInstance = window[CACHE_TYPE[cacheType]];
|
||||||
@ -170,20 +163,9 @@ function handleCachingQueueError(ctx, config) {
|
|||||||
const _key = genInnerKey(ctx.key, config.cache.cacheType);
|
const _key = genInnerKey(ctx.key, config.cache.cacheType);
|
||||||
const queue = cachingQueue.get(_key);
|
const queue = cachingQueue.get(_key);
|
||||||
if (queue && queue.length > 0) {
|
if (queue && queue.length > 0) {
|
||||||
// 非 merge 类型,进行队列重试,直到有一个请求成功,后面的全部成功
|
const firstResolve = queue.shift();
|
||||||
if (config.cache.cacheType !== CACHE_TYPE.merge) {
|
firstResolve();
|
||||||
const firstResolve = queue.shift();
|
cachingQueue.set(_key, queue);
|
||||||
firstResolve();
|
|
||||||
cachingQueue.set(_key, queue);
|
|
||||||
} else {
|
|
||||||
queue.forEach((resolve) => {
|
|
||||||
resolve({
|
|
||||||
error: ctx.error
|
|
||||||
});
|
|
||||||
});
|
|
||||||
cachingQueue.delete(_key);
|
|
||||||
cacheStartFlag.delete(_key);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
cachingQueue.delete(_key);
|
cachingQueue.delete(_key);
|
||||||
cacheStartFlag.delete(_key);
|
cacheStartFlag.delete(_key);
|
||||||
|
@ -1,17 +1,63 @@
|
|||||||
const requestMap = new Map();
|
const requestMap = new Map();
|
||||||
|
|
||||||
export default async (ctx, next) => {
|
const mergeRequestMap = new Map();
|
||||||
const key = ctx.key;
|
const requestQueue = new Map();
|
||||||
if (requestMap.get(key)) {
|
|
||||||
ctx.error = {
|
function handleCachingStart(ctx) {
|
||||||
type: 'REPEAT',
|
const isRequesting = mergeRequestMap.get(ctx.key);
|
||||||
msg: '重复请求'
|
if (isRequesting) {
|
||||||
};
|
return new Promise((resolve) => {
|
||||||
return;
|
const queue = requestQueue.get(ctx.key) || [];
|
||||||
|
requestQueue.set(ctx.key, queue.concat(resolve));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
mergeRequestMap.set(ctx.key, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRepeatRequest(ctx) {
|
||||||
|
const queue = requestQueue.get(ctx.key);
|
||||||
|
if (queue && queue.length > 0) {
|
||||||
|
queue.forEach((resolve) => {
|
||||||
|
if (ctx.error) {
|
||||||
|
resolve({
|
||||||
|
error: ctx.error
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resolve({
|
||||||
|
response: ctx.response
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
requestQueue.delete(ctx.key);
|
||||||
|
mergeRequestMap.delete(ctx.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async (ctx, next) => {
|
||||||
|
if (ctx.config.mergeRequest) {
|
||||||
|
const result = await handleCachingStart(ctx);
|
||||||
|
if (result) {
|
||||||
|
Object.keys(result).forEach((key) => {
|
||||||
|
ctx[key] = result[key];
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (requestMap.get(ctx.key) && !ctx.config.mergeRequest) {
|
||||||
|
ctx.error = {
|
||||||
|
type: 'REPEAT',
|
||||||
|
msg: '重复请求'
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
requestMap.set(ctx.key, true);
|
||||||
}
|
}
|
||||||
requestMap.set(key, true);
|
|
||||||
|
|
||||||
await next();
|
await next();
|
||||||
|
|
||||||
requestMap.delete(key);
|
if (ctx.config.mergeRequest) {
|
||||||
|
handleRepeatRequest(ctx);
|
||||||
|
} else {
|
||||||
|
requestMap.delete(ctx.key);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -22,9 +22,21 @@ export default {
|
|||||||
const clickIcon = () => {
|
const clickIcon = () => {
|
||||||
console.log('click Icon');
|
console.log('click Icon');
|
||||||
};
|
};
|
||||||
request('/api', null).then((res) => {
|
// request('/api', null, {
|
||||||
console.log(res);
|
// mergeRequest: true
|
||||||
});
|
// }).then((res) => {
|
||||||
|
// console.log(res);
|
||||||
|
// });
|
||||||
|
// request('/api', null, {
|
||||||
|
// mergeRequest: true
|
||||||
|
// }).then((res) => {
|
||||||
|
// console.log(res);
|
||||||
|
// });
|
||||||
|
// request('/api', null, {
|
||||||
|
// mergeRequest: true
|
||||||
|
// }).then((res) => {
|
||||||
|
// console.log(res);
|
||||||
|
// });
|
||||||
// request('/api', null, {
|
// request('/api', null, {
|
||||||
// throttle: 3000,
|
// throttle: 3000,
|
||||||
// cache: true
|
// cache: true
|
||||||
@ -56,27 +68,21 @@ export default {
|
|||||||
// });
|
// });
|
||||||
// }, 3200);
|
// }, 3200);
|
||||||
|
|
||||||
// request('/api', null, {
|
request('/api', null, {
|
||||||
// cache: {
|
cache: true
|
||||||
// cacheType: 'merge'
|
}).then((res) => {
|
||||||
// }
|
console.log(res);
|
||||||
// }).then((res) => {
|
});
|
||||||
// console.log(res);
|
request('/api', null, {
|
||||||
// });
|
cache: true
|
||||||
// request('/api', null, {
|
}).then((res) => {
|
||||||
// cache: {
|
console.log(res);
|
||||||
// cacheType: 'merge'
|
});
|
||||||
// }
|
request('/api', null, {
|
||||||
// }).then((res) => {
|
cache: true
|
||||||
// console.log(res);
|
}).then((res) => {
|
||||||
// });
|
console.log(res);
|
||||||
// request('/api', null, {
|
});
|
||||||
// cache: {
|
|
||||||
// cacheType: 'merge'
|
|
||||||
// }
|
|
||||||
// }).then((res) => {
|
|
||||||
// console.log(res);
|
|
||||||
// });
|
|
||||||
|
|
||||||
// request('/api', null, {
|
// request('/api', null, {
|
||||||
// // skipErrorHandler: [500]
|
// // skipErrorHandler: [500]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user