返回介绍

solution / 2800-2899 / 2805.Custom Interval / README

发布于 2024-06-17 01:02:59 字数 2918 浏览 0 评论 0 收藏 0

2805. 自定义间隔

English Version

题目描述

函数 customInterval

给定一个函数 fn、一个数字 delay 和一个数字 period,返回一个数字 idcustomInterval 是一个函数,它应该根据公式 delay + period * count 在间隔中执行提供的函数 fn,公式中的 count 表示从初始值 0 开始执行间隔的次数。

函数 customClearInterval

给定 idid 是从函数 customInterval 返回的值。customClearInterval 应该停止在间隔中执行提供的函数 fn

注意:在 Node.js 中,setTimeoutsetInterval 函数返回一个对象,而不是一个数字。

 

示例 1:

输入:delay = 50, period = 20, stopTime = 225
输出:[50,120,210]
解释:
const t = performance.now()  
const result = []
        
const fn = () => {
  result.push(Math.floor(performance.now() - t))
}
const id = customInterval(fn, delay, period)

setTimeout(() => {
  customClearInterval(id)
}, 225)

50 + 20 * 0 = 50 // 50ms - 第一个函数调用
50 + 20 * 1 = 70 // 50ms + 70ms = 120ms - 第二个函数调用
50 + 20 * 2 = 90 // 50ms + 70ms + 90ms = 210ms - 第三个函数调用

示例 2:

输入:delay = 20, period = 20, stopTime = 150
输出:[20,60,120]
解释:
20 + 20 * 0 = 20 // 20ms - 第一个函数调用
20 + 20 * 1 = 40 // 20ms + 40ms = 60ms - 第二个函数调用
20 + 20 * 2 = 60 // 20ms + 40ms + 60ms = 120ms - 第三个函数调用

示例 3:

输入:delay = 100, period = 200, stopTime = 500
输出:[100,400]
解释:
100 + 200 * 0 = 100 // 100ms - 第一个函数调用
100 + 200 * 1 = 300 // 100ms + 300ms = 400ms - 第二个函数调用

 

提示:

  • 20 <= delay, period <= 250
  • 20 <= stopTime <= 1000

解法

方法一

const intervalMap = new Map<number, NodeJS.Timeout>();

function customInterval(fn: Function, delay: number, period: number): number {
  let count = 0;
  function recursiveTimeout() {
    intervalMap.set(
      id,
      setTimeout(() => {
        fn();
        count++;
        recursiveTimeout();
      }, delay + period * count),
    );
  }

  const id = Date.now();
  recursiveTimeout();
  return id;
}

function customClearInterval(id: number) {
  if (intervalMap.has(id)) {
    clearTimeout(intervalMap.get(id)!);
    intervalMap.delete(id);
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文