支持长时间setTimeout实现

/**
 * 支持非常长的类`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;
}
posted @ 2024-09-03 14:29  Better-HTQ  阅读(7)  评论(0编辑  收藏  举报