112 lines
2.5 KiB
JavaScript
112 lines
2.5 KiB
JavaScript
import { DEFAULT_FETCH_INTERVAL, DEFAULT_FETCH_LIMIT } from "../config";
|
|
import { kissLog } from "./log";
|
|
|
|
/**
|
|
* 任务池
|
|
* @param {*} fn
|
|
* @param {*} preFn
|
|
* @param {*} _interval
|
|
* @param {*} _limit
|
|
* @returns
|
|
*/
|
|
const taskPool = (_interval = 100, _limit = 100, _retryInteral = 1000) => {
|
|
const pool = [];
|
|
const maxRetry = 2; // 最大重试次数
|
|
let maxCount = _limit; // 最大数量
|
|
let curCount = 0; // 当前数量
|
|
let interval = _interval; // 间隔时间
|
|
let timer = null;
|
|
|
|
const run = async () => {
|
|
// console.log("timer", timer);
|
|
timer && clearTimeout(timer);
|
|
timer = setTimeout(run, interval);
|
|
|
|
if (curCount < maxCount) {
|
|
const item = pool.shift();
|
|
if (item) {
|
|
curCount++;
|
|
const { fn, args, resolve, reject, retry } = item;
|
|
try {
|
|
const res = await fn(args);
|
|
resolve(res);
|
|
} catch (err) {
|
|
kissLog(err, "task");
|
|
if (retry < maxRetry) {
|
|
const retryTimer = setTimeout(() => {
|
|
clearTimeout(retryTimer);
|
|
pool.push({ args, resolve, reject, retry: retry + 1 });
|
|
}, _retryInteral);
|
|
} else {
|
|
reject(err);
|
|
}
|
|
} finally {
|
|
curCount--;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
return {
|
|
push: async (fn, args) => {
|
|
if (!timer) {
|
|
run();
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
pool.push({ fn, args, resolve, reject, retry: 0 });
|
|
});
|
|
},
|
|
update: (_interval = 100, _limit = 100) => {
|
|
if (_interval >= 0 && _interval <= 5000 && _interval !== interval) {
|
|
interval = _interval;
|
|
}
|
|
if (_limit >= 1 && _limit <= 100 && _limit !== maxCount) {
|
|
maxCount = _limit;
|
|
}
|
|
},
|
|
clear: () => {
|
|
pool.length = 0;
|
|
curCount = 0;
|
|
timer && clearTimeout(timer);
|
|
timer = null;
|
|
},
|
|
};
|
|
};
|
|
|
|
/**
|
|
* 请求池实例
|
|
*/
|
|
let fetchPool;
|
|
|
|
/**
|
|
* 获取请求池实例
|
|
*/
|
|
export const getFetchPool = (interval, limit) => {
|
|
if (!fetchPool) {
|
|
fetchPool = taskPool(
|
|
interval ?? DEFAULT_FETCH_INTERVAL,
|
|
limit ?? DEFAULT_FETCH_LIMIT
|
|
);
|
|
} else if (interval && limit) {
|
|
updateFetchPool(interval, limit);
|
|
}
|
|
|
|
return fetchPool;
|
|
};
|
|
|
|
/**
|
|
* 更新请求池参数
|
|
* @param {*} interval
|
|
* @param {*} limit
|
|
*/
|
|
export const updateFetchPool = (interval, limit) => {
|
|
fetchPool && fetchPool.update(interval, limit);
|
|
};
|
|
|
|
/**
|
|
* 清空请求池
|
|
*/
|
|
export const clearFetchPool = () => {
|
|
fetchPool && fetchPool.clear();
|
|
};
|