/**
* 支持非常长的类`setTimeout`延迟定时器。
*
* @param {Function} callback - 延迟执行的回调函数。
* @param {number} delay - 延迟的时间,单位为毫秒。支持超过 `setTimeout` 最大限制(2^31 - 1 毫秒,约24.8天)的延迟时间。
* @param {...*} args - 在回调函数执行时传递的额外参数。
* @returns {Object} 一个包含 `clear` 方法的对象,用于取消定时器。
*
* @example
* const timer = setLongTimeout(() => {
* console.log('50天后执行了!');
* }, 50 * 24 * 60 * 60 * 1000);
*
* // 取消定时器:
* timer.clear();
*/
export function setLongTimeout(callback, delay, ...args) {
const MAX_DELAY = 2147483647;
let timeoutId;
const handler = {
clear: () => clearTimeout(timeoutId),
};
const run = (remainingDelay) => {
if (remainingDelay > MAX_DELAY) {
timeoutId = setTimeout(() => {
run(remainingDelay - MAX_DELAY);
}, MAX_DELAY);
} else {
timeoutId = setTimeout(callback, remainingDelay, ...args);
}
};
run(delay);
return handler;
}