如何强制实行 setTimeout 与 setInterval 的最佳实践「终于解决」

如何强制实行 setTimeout 与 setInterval 的最佳实践「终于解决」在 JavaScript 异步编程中,作者经常会写出各种各样的 bug,其中最常见的错误,都是由于忘记清除 setTimeout 或者 setInterval 创建的定时器引起的。 组件挂载后,每隔一秒会将 sec 的值加 1,看起来一切正常,但是,当组件被卸载的时候,setI…

TL;DR(太长不看版)

请使用 github.com/littlee/esl…

背景

在 JavaScript 异步编程中,作者经常会写出各种各样的 bug,其中最常见的错误,都是由于忘记清除 setTimeout 或者 setInterval 创建的定时器引起的。

考虑下面这段代码,以一个简单的 React 组件为例

import { useEffect, useState } from 'react';
function App() {
  const [sec, setSec] = useState(0);
  useEffect(() => {
    setInterval(() => {
      setSec((s) => s + 1);
    }, 1000);
  }, []);
  return <p>{sec}</p>;
}

组件挂载后,每隔一秒会将 sec 的值加 1,看起来一切正常,但是,当组件被卸载的时候,setInterval 创建的定时器仍然在持续运行。

经验丰富的读者应该能马上想到,我们可以通过在 useEffect 返回的函数中清除这个定时器来修复这个问题。

改善后的代码如下:

import { useEffect, useState } from 'react';
function App() {
  const [sec, setSec] = useState(0);
  useEffect(() => {
    let timer = setInterval(() => {
      setSec((s) => s + 1);
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  }, []);
  return <p>{sec}</p>;
}

问题到这里就完美解决了,但是,对于新手来说,常常需要在运行代码之后才会发现这个错误,而且,在一些没有开发者调试工具的环境(例如移动端 webview)下,类似的错误经常被遗漏。

读到这里,有兴趣的读者可以尝试在编辑器中对自己的某个项目源码进行搜索,如果 setIntervalclearInterval 的搜索结果数量不相等,那么,这个项目就很有可能隐藏了类似的错误,同理,也适用于 setTimeoutclearTimeout

因此,作者开发了一款 eslint 插件,让项目在编码期间,就可以消除类似的错误。

解决方法

eslint-plugin-clean-timer

github 包地址:github.com/littlee/esl…

使用

第一步,在项目目录中安装 eslint 并初始化(已存在 eslint 配置请跳过这一步)

npm i -D eslint
npx eslint --init

第二步,安装 eslint-plugin-clean-timer

npm i -D eslint-plugin-clean-timer

并添加一下配置到 eslint 配置中,关于配置文件位置请参考 eslint.org/docs/user-g…

{
  "plugins": ["clean-timer"],
  "rules": {
    "clean-timer/assign-timer-id": 2
  }
}

此时,打开带有定时器代码的文件,我们可以看到编辑器会对相关代码进行提示,以 VSCode 为例,需要安装 ESLint 拓展

image.png

如果修改了配置文件之后没有生效,可以尝试按 Command(Ctrl)+Shift+P,在弹出面板中找到 ESLint: Restart ESLint Server 命令,并按回车键执行

image.png

除此之外,作者还提供了贴心的修复建议,点击 ESLint 提示的 Quick Fix…,执行第一个选项,可以自动插入一个赋值语句

Apr-01-2021 23-17-17.gif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13134.html

(0)

相关推荐

  • 用Python正则表达式实现文本匹配和替换功能

    用Python正则表达式实现文本匹配和替换功能正则表达式是一种强大的文本处理工具,它可以帮助我们在一定规则下找到需要处理的内容,并进行相应的处理操作,比如查找、替换、匹配等。Python作为一门强大的编程语言,提供了re模块来支持正则表达式的操作。接下来,我们将从以下几个方面来详细阐述如何用Python正则表达式实现文本匹配和替换功能。

    2024-03-14
    85
  • 使用Python List1实现数据存储和处理

    使用Python List1实现数据存储和处理a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-03-03
    90
  • 五个值得掌握的 Python Tuple 用法

    五个值得掌握的 Python Tuple 用法Python 中的 Tuple (元组)是一种不可变序列。

    2024-01-11
    100
  • 使用Editplus运行Python代码

    使用Editplus运行Python代码Python是一门优秀的编程语言,可以用于各种不同的任务,包括物联网、Web应用程序、科学计算等等。而Editplus则是一款功能强大的文本编辑器,特别适合编写代码。本篇文章将向读者介绍如何使用Editplus运行Python代码。

    2024-07-22
    34
  • 如何退出vim

    如何退出vim Vim是Linux和Unix操作系统中经常使用的强大文本编辑器。它是一个非常灵活的编辑器,由于其广泛的功能和实用性,Vim已经成为了许多开发人员和系统管理员之间使用的首选。在使用Vim时,最常见的问题之一是如何退出编辑器。在本文中,我们将详细介绍如何在不同的情况下退出Vim编辑器。

    2024-05-08
    71
  • Mysql实战45讲 百度网盘_mysql实战45讲百度云

    Mysql实战45讲 百度网盘_mysql实战45讲百度云MySQL实战45讲 3

    2023-05-27
    143
  • Python编写在Mac OS上创建新目录(文件夹)

    Python编写在Mac OS上创建新目录(文件夹)a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-01-13
    101
  • FlutterBoost管理混合栈iOS实践「建议收藏」

    FlutterBoost管理混合栈iOS实践「建议收藏」官方方案在Native和Flutter页面交叉跳转时于Flutter Engine数量会线性增加导致内存暴增(这里指图片缓存等比较消耗内存的对象)。 多个FlutterViewController,插件的注册和通信将会变得混乱难以维护,消息的传递的源头和目标也变得不可控。 Fl…

    2023-07-26
    122

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注