JavaScript 定时器关键点及使用场景解析

目录
  • 正文
    • 关于计时器的关键点
    • 异步函数
    • setTimeout
    • setInterval
    • 区别
    • 使用场合
  • 总结

正文

JavaScript 定时器是实现循环行为甚至触发延迟操作的好功能。无论有什么基于时间的逻辑,定时器都可以提供支持。在 JavaScript 中有两个定时器函数:setTimeoutsetInterval 。接下来看看有哪些定时器以及它们是如何工作的。

关于计时器的关键点

在深入了解定时器的具体细节之前,有几个非常关键的点需要记住。

并不完全准确

定时器要么在一定秒数后触发一个动作,要么在每次指定的超时结束时重复一个动作。但是,尽管期望可能是它们精确到秒,但事实并非如此。

这些计时器的规范声明它们将使用时间参数(如指定的秒数)作为最短等待时间。但如果还有其他任务需要先完成,它们肯定会花费更长的时间。

只有当你逻辑依赖于精确的时间测量时,这才会成为问题,比如让时钟通过 setInterval 回调来计算秒数。

异步函数

这意味着它们在完成之前不会停止程序流。即使指定 0 作为超时值,它们的行为仍然是异步的。

这意味着这些函数会将对想要触发的函数的引用添加到事件循环中,所以即使在超时值上指定了 0,引用也会在接下来发生的所有事情之后排队。

setTimeout

setTimeout 函数可能是最容易理解的函数,因为主要目标是在几秒后触发一个函数,只会执行一次。

这个函数参数如下:

  • 要执行的函数引用:这是时间一到就会触发的代码逻辑。
  • 函数执行前的等待的秒数
  • 然后所有其他参数以相同的顺序传递给执行的函数。

下面的代码将在 3 秒后打印 Hello World

setTimeout(console.log, 3000, "Hello", "World");

等效于以下代码:

setTimeout(
    (strHello, strWorld) => {
        console.log(strHello, strWorld);
    },
    3000,
    "Hello",
    "World"
);

setTimeout 是一种特殊类型的异步函数,因此无论在其后编写什么代码,都将在触发该函数之前执行,如下:

console.log("执行了第 1 行代码");
setTimeout(() => {
    console.log("执行了第 3 行代码");
}, 1000);
console.log("执行了第 5 行代码");
console.log("执行了第 6 行代码");
setTimeout(function () {
    console.log("执行了第 8 行代码");
}, 0);
console.log("执行了第 10 行代码");

输出的结果如下:

执行了第 1 行代码
执行了第 5 行代码
执行了第 6 行代码
执行了第 10 行代码
执行了第 8 行代码
执行了第 3 行代码

请注意第 3 行和第 8 行是如何最后执行的,即使第 8 行的超时为 0

在讨论 setTimeout 之前,如果设置超时值然后意识到必须停止它会发生什么?可以定义一个变量保存 setTimeout 的返回值(计时器 ID),则可以使用 clearTimeout 函数在超时之前停止计时器。

console.log("执行了第 1 行代码");
const timerId = setTimeout(() => {
    console.log("执行了第 3 行代码");
}, 1000);
console.log("执行了第 5 行代码");
clearTimeout(timerId);
console.log("执行了第 6 行代码");
setTimeout(function () {
    console.log("执行了第 8 行代码");
}, 0);
console.log("执行了第 10 行代码");

执行结果如下,少了一个定时器的输出:

执行了第 1 行代码
执行了第 5 行代码
执行了第 6 行代码
执行了第 10 行代码
执行了第 8 行代码

setInterval

setInterval 函数与 setTimeout 非常相似,但它不是只触发一次函数,而是一直触发函数直到停止。

此函数的签名与 setInterval 函数的签名完全相同,所有参数的也相同。

const names = ["刘备", "关羽", "张飞", "赵云", "黄忠"];
function sayHi(list) {
    let name = list[Math.round(Math.random() * 10) % 4];
    console.log("你好!", name);
}
console.log("蜀汉五虎将");
const intervalID = setInterval(sayHi, 1000, names);
setTimeout(() => {
    clearTimeout(intervalID);
}, 4000);

上面的代码将启动一个每 1 秒触发一次的循环,当它触发时,将选择一个随机名称并打印字符串 你好! <name>。设置了 4 秒的超时时间,通过调用 clearTimeout 函数来结束无限循环。当然,也可以使用 clearInterval 函数,但由于它们使用相同的计时器池,可以互换使用它们。

区别

setTimeout 仅触发一次表达式,而 setInterval 在给定的时间间隔后保持定期触发表达式(除非手动终止)。

使用场合

除了执行定时操作,结合 Promise 方法,结合 setTimeout 可以实现休眠功能。

const sleep = (ms) => {
    return new Promise((resolve) => setTimeout(resolve, ms));
};
const asyncFoo = async () => {
    await sleep(2000);
    console.log("  等待2秒输出");
    await sleep(1000);
    console.log("    等待1秒输出");
};
console.log("开始执行");
asyncFoo();

Promise 结合 setInterval 可以实现一些数据的最大检测次数,如某个数据通过API验证,验证结果无法给出正常结果,超过一定次数提示错误。

const fakeApiCheck = async () => {
    console.log("检查中...");
    return Math.random() > 0.8;
};
const asyncInterval = async (callback, ms, triesLeft = 5) => {
    return new Promise((resolve, reject) => {
        const interval = setInterval(async () => {
            if (await callback()) {
                resolve();
                clearInterval(interval);
            } else if (triesLeft <= 1) {
                reject();
                clearInterval(interval);
            }
            triesLeft--;
        }, ms);
    });
};
const dataCheck = async () => {
    try {
        await asyncInterval(fakeApiCheck, 500);
    } catch (e) {
        console.log("验证错误");
    }
    console.log("验证完成!");
};
dataCheck();

总结

计时器是生成重复或延迟行为的绝佳函数,它们非常有用,尤其是当必须在某些基于时间的条件下与其他服务进行交互时。超时和间隔都可以在使用 clearInterval 或者 clearTimeout 函数触发之前强制停止。

以上就是JavaScript 定时器关键点及使用场景解析的详细内容,更多关于JavaScript 定时器的资料请关注我们其它相关文章!

(0)

相关推荐

  • JS中2种定时器的使用及清除的实现

    目录 一.什么是定时器? 二.定时器的分类 1.一次性定时器: 2.周期性定时器: 三.清除定时器 一.什么是定时器? 定时器就是由JS提供了一些原生方法来实现延时去执行某一段代码. 二.定时器的分类 1.一次性定时器: setTimeout: 设置一个定时器,在定时器到期后执行一次函数或代码段 使用方法:var timer=setTimeout(fun,毫秒数) 清除的方法:clearTimeout(timeoutId) //一次性 var timeoutId = window.setTime

  • JS定时器不可靠的原因及解决方案

    目录 前言 定时器工作原理 setInterval调用被废弃 事件循环 导致定时器不可靠的原因 延迟执行时间有最大值 解决方案 总结 前言 在工作中应用定时器的场景非常多,但你会发现有时候定时器好像并没有按照我们的预期去执行,比如我们常遇到的setTimeout(()=>{},0)它有时候并不是按我们预期的立马就执行.想要知道为什么会这样,我们首先需要了解Javascript计时器的工作原理. 定时器工作原理 为了理解计时器的内部工作原理,我们首先需要了解一个非常重要的概念:计时器设定的延时是没

  • JavaScript中定时器setTimeout()和setInterval()的用法

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. 一.setTimeout() setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行.它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器. var timerId = setTimeout(func|code, delay) 上面代码中,setTimeout函数接受两个参数,第一个参数func|code是将要推迟执行的函数名

  • 浏览器切换到其他标签页或最小化js定时器是否准时测试

    目录 前言 浏览器可见和不可见状态 setInterval setTimeout requestAnimationFrame 总结 如何解决 前言 这是我最近开发碰到的一个问题,本文是我测试出来的实践结果,供大家参考. 关于js定时器,setInterval和setTimeout,作为我们日常开发经常使用到的方法,大家一定非常熟悉.比如下面一个例子: setInterval(() => { console.log('1'); }, 500); 作为刚学前端没多久的新人也能知道,这段代码就是每过5

  • JavaScript定时器原理

    目录 一. setTimeout() 定时器 二.停止 setTimeout() 定时器 三.setInterval() 定时器 四.清除setInterval() 定时器 五.电子时钟案例 前言: 在很多页面中,我们都可以看到一些倒计时或者和时间相关的效果,今天小熊将就JavaScript里面的倒计时做一概述. 首先,我们先来看看定时器,在JS中,有两种定时器: 一. setTimeout() 定时器 语法: window.setTimeout(调用函数, [延迟的毫秒数]); setTime

  • JavaScript实现定时器循环展示数组

    本文实例为大家分享了JavaScript实现定时器循环展示数组的具体代码,供大家参考,具体内容如下 先看看效果图 流程 使用数组的slice() 方法通过条件判断截取原数组相应内容组成新数组 循环数组 let currentPage = 0 // arr:原数组 newLen:新数组需要的长度 currentPage:现在的页码 // 方法一: function loopData(arr, newLen) {   let len = arr.length;   let result = len

  • JavaScript 定时器关键点及使用场景解析

    目录 正文 关于计时器的关键点 异步函数 setTimeout setInterval 区别 使用场合 总结 正文 JavaScript 定时器是实现循环行为甚至触发延迟操作的好功能.无论有什么基于时间的逻辑,定时器都可以提供支持.在 JavaScript 中有两个定时器函数:setTimeout 和 setInterval .接下来看看有哪些定时器以及它们是如何工作的. 关于计时器的关键点 在深入了解定时器的具体细节之前,有几个非常关键的点需要记住. 并不完全准确 定时器要么在一定秒数后触发一

  • 在javascript中创建对象的各种模式解析

    最近在看<javascript高级程序设计>(第二版) javascript中对象的创建 •工厂模式 •构造函数模式 •原型模式 •结合构造函数和原型模式 •原型动态模式 面向对象的语言大都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象.虽然从技术上讲,javascript是一门面向对象的语言,但是javascript没有类的概念,一切都是对象.任意一个对象都是某种引用类型的实例,都是通过已有的引用类型创建:引用类型可以是原生的,也可以是自定义的.原生的引用类型有:Object.A

  • JavaScript定时器setTimeout()和setInterval()详解

    本文实例为大家分享了JavaScript定时器的具体方法,供大家参考,具体内容如下 1. 超时调用setTimeout() 顾名思义,超时调用的意思就是在一段实际之后调用(在执行代码之前要等待多少毫秒) setTimeout()他可以接收两个参数: 1.要执行的代码或函数 2.毫秒(在执行代码之前要等待多少毫秒) function test(){ alert("孙悟空"); } setTimeout(test,2000); //2s后弹出 "孙悟空" clearTi

  • javascript 定时器工作原理分析

    setTimeout() MDN对 setTimeout 的定义为: 在指定的延迟时间之后调用一个函数或执行一个代码片段. 语法 setTimeout 的语法非常简单,第一个参数为回调函数,第二个参数为延时的时间.函数返回一个数值类型的ID唯一标示符,此ID可以用作 clearTimeout 的参数来取消定时器: var timeoutID = window.setTimeout(code, delay); IE0+ 还支持回调参数的传入: var timeoutID = window.setT

  • javascript定时器完整实例

    本文实例讲述了javascript定时器完整实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type&qu

  • JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)

    废话不多说了,直接给大家贴代码了. // 每隔五秒定时刷新当前窗口 setTimeout("self.location.reload();",5000); //js 定时关闭窗口(ie和FF中测试过) //6秒后自动关闭当前窗口 setTimeout("window.opener=null;window.close()",6000); 下面给大家介绍下javascript定时器使用 使用定时器实现JavaScript的延期执行或重复执行 window对象提供了两个方

  • javascript中JSON.parse()与eval()解析json的区别

    本文实例讲述了javascript中JSON.parse()与eval()解析json的区别.分享给大家供大家参考,具体如下: JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Javascript原生格式,这意味着在javascript中处理JSON数据 基本格式: varjsonData='{"data1":"Hello,","data2"

  • 理解javascript定时器中的setTimeout与setInterval

    一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 setTimeout: var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); var timeoutID = window.setTimeout(code, delay); timeoutID 是该延时操作的数字ID,

  • javascript定时器取消定时器及优化方法

    javascript定时器取消定时器及js定时器优化方法 通常用的方法: 启动定时器: window.setInterval(Method,Time) Method是定时调用的js方法 Time是间隔时间,单位是毫秒 取消定时器: clearInterval(Method); 那么问题来了.用 clearInterval(timerid);来清除,往往不能马上停止,用什么方法比较好解决? 优化方案如下 var timeout = false; //启动及关闭按钮 function time()

  • JavaScript中 this 指向问题深度解析

    JavaScript 中的 this 指向问题有很多文章在解释,仍然有很多人问.上周我们的开发团队连续两个人遇到相关问题,所以我不得不将关于前端构建技术的交流会延长了半个时候讨论 this 的问题. 与我们常见的很多语言不同,JavaScript 函数中的 this 指向并不是在函数定义的时候确定的,而是在调用的时候确定的.换句话说, 函数的调用方式决定了 this 指向 . JavaScript 中,普通的函数调用方式有三种:直接调用.方法调用和 new 调用.除此之外,还有一些特殊的调用方式

随机推荐