Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 4x 5x 3x 3x 16x 8x 8x 5x 5x 5x 8x 8x 1x | /**
* 包装为一个缓存函数,限定时间内,返回之前执行的 Promise 结果
* - 默认在回调执行前多次请求时,返回第一个回调结果
* - 可实现基于 Promise 机制的防抖能力。
* @method setPromiseCache
* @param {Function} fn 返回 Promise 对象的函数
* @param {Number} cacheTime 数据缓存时间(ms),传负值则为永久缓存
* @returns {Function} 经过包装的函数
* @example
* import { setPromiseCache } from '@spore-ui/tskit';
* let index = 0;
* const increase = () => new Promise(resolve => {
* setTimeout(() => {
* index += 1;
* resolve(index);
* }, 10);
* });
* const cacheIncrease = setPromiseCache(increase);
* const exec = async () => {
* const rs = await cacheIncrease();
* console.info(rs);
* };
* exec(); // 1
* exec(); // 1
*/
export type TypePromiseFn = (...args: any[]) => Promise<any>;
export function setPromiseCache<T extends TypePromiseFn>(
fn: T,
cacheTime: number = 0,
): T {
let pm: Promise<any> = null;
let startTime: number = null;
return (async (...args: any[]) => {
let rs = null;
const now = new Date().getTime();
if (
cacheTime >= 0
&& (now - startTime) > cacheTime
) {
pm = null;
}
if (!pm) {
startTime = new Date().getTime();
pm = fn(...args);
}
rs = await pm;
return rs;
}) as T;
}
export default setPromiseCache;
|