首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

setTimeout的那些事

以上体现了Javascript在浏览器运行环境中的局限性,单线程。实际上,不仅是在浏览器环境中,在Nodejs环境中的javascript也是单线程的。...他Promise会帮你做的任务肯定会做(只要他没有猝死。。),但时间上可能并不一定严格符合你的要求,毕竟小本本上可能不仅只有一条任务。...是时候严肃一下了,我们改一下以上的称呼方式: JS主线程 => BOSS 同步任务 => BOSS手头上正在做的任务 异步任务(队列) => BOSS的小本本上的任务 setTimeout这个方法相信很多初学者都有过误解...实际上,setTimeout做的事情是:在指定delay时间后,将指定方法作为异步任务添加到异步任务队列中。...最惨的是,即使天时地利人和,到了定时的时间时,JS主线程空闲,异步任务队列中只有setTimeout执行的方法,这个方法的执行时间也并不是精确的delay时间(精确到毫秒),因为浏览器上的计时器精确度有限

1.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    setTimeout的那些事

    以上体现了Javascript在浏览器运行环境中的局限性,单线程。实际上,不仅是在浏览器环境中,在Nodejs环境中的javascript也是单线程的。...他Promise会帮你做的任务肯定会做(只要他没有猝死。。),但时间上可能并不一定严格符合你的要求,毕竟小本本上可能不仅只有一条任务。...是时候严肃一下了,我们改一下以上的称呼方式: JS主线程 => BOSS 同步任务 => BOSS手头上正在做的任务 异步任务(队列) => BOSS的小本本上的任务 setTimeout这个方法相信很多初学者都有过误解...实际上,setTimeout做的事情是:在指定delay时间后,将指定方法作为异步任务添加到异步任务队列中。...最惨的是,即使天时地利人和,到了定时的时间时,JS主线程空闲,异步任务队列中只有setTimeout执行的方法,这个方法的执行时间也并不是精确的delay时间(精确到毫秒),因为浏览器上的计时器精确度有限

    2.1K00

    HDFS 是如何实现大数据高容量、高速、可靠的存储和访问的。

    对于一个企业大数据应用来说,搞定了大数据存储基本上就解决了大数据应用最重要的问题。...从hdfs系统架构就可以看出,通过将大文件切分成小的数据块存储到不同服务器上,可以实现一个大文件的存储,同时通过联合多个服务器多块硬盘实现整个存储系统的大容量,大文件的分片存储,不同分片可以进行并行读写操作...首先我们来看下数据存储的故障容错,这块主要是磁盘介质,存储数据可能会出现错乱,这个HDFS主要会对存储在DataNode上的数据块,计算并存储校验和,并计算Datanode读取数据的校验和,如果异常就会转而去读取其他...其次,节点故障,磁盘,HDFS节点故障主要是通过心跳机制,DataNode会定期通过心跳去NameNode保持联系,Namenode监测到DataNode超时没有心跳后,就会查其元数据,通知其他节点复制失效节点上的数据块到其他服务器上...接着NameNode鼓掌容错,作为HDFS核心节点,记录着HDFS文件分配表信息,所有的文件路径和数据块存储信息都保存在NameNode上,NameNode故障将导致整个集群的不可用,HDFS设计采用主从热备提高系统的可用性

    2.1K20

    Promise、setTimeout的执行顺序

    同步和异步任务 ​ 要了解异步线程我们首先应该明白它的用处,因为js的单线程特性,任务的执行顺序都是依次执行,而当我们在工作中遇到网络请求,前后端交互的时候,你的数据不会马上拿到,这需要时间,如果等拿到数据再执行下面的代码...,今天我们主要看看在浏览器中,我们经常会遇到的有 promise 和 setTimeout 我们通过下面这段代���来看看: console.log(1) setTimeout(() => console.log...promise的执行顺序优先于setTimeout所以由此可知,在异步任务中,微任务优先于宏任务执行,可以看看下图。...setTimeout2 最后,执行 console.log(10), 输出 10 上一轮事件循环结束,我们发现,已经输出 1 5 10 了, 按照我们之前所说,这个时候,主线程会去检查 是否存在微任务...,不难发现,这个时候的 event queue 是这个样子的 micro Task (微任务) macro Task(宏任务) promise1 setTimeout1 setTimeout2 主线程

    67720

    你不知道的setTimeout

    先举个例子在来具体看看其使用: let timer = setTimeout((...params) => { console.log( ...params) }, 1000, 'setTimeout...'); // 1s后打印出 setTimeout, 可以看到调用模式如下: let timer = setTimout(fn, delay, params) 参数:fn 为要执行的函数或者代码段, delay...尽管setTimeout 以0ms的延迟来调用函数,但这个任务已经被放入了队列中并且等待下一次执行;并不是立即执行;队列中的等待函数被调用之前,当前代码必须全部运行完毕。...虽然调用了两次只会打印一次 let debounceLog = debounce(() => { console.log(2) },50); debounceLog(); debounceLog(); 轮询 有时需要不断的获取某个数据最新的状态...,那么可使用setTimoute来实现,伪代码如下: function fetchData() { // 获取数据 data = fetch(params); // 定时拉取 setTimeout

    28530

    博文精译-高容量分布式系统的容错

    当一个API依赖项在高容量,请求延迟增加(导致请求线程阻塞)的情况下失败,它会很快(秒或亚秒以下)使所有可用的Tomcat(或Jetty等其他容器)请求线程饱和,并导致整个API崩溃。...因此,高容量、高可用性的应用程序需要在其体系结构中构建容错功能,而不是指望基础设施为它们解决这个问题。...根据以上架构上的考虑,我们选择了组合多种容错方法的解决方案: 网络超时和重试 根据每个依赖分离单独的线程池 信号量(通过tryAcquire,而不是阻塞调用) 断路器 这些容错方法各有优缺点,但是当它们结合在一起时...每个DependencyCommand都能够定义一个回退函数(后面会详细讨论),该函数在用户调用线程上执行,不应该执行网络调用。...我们根据对用户体验的影响,使用了这些回退方法: 缓存:如果实时依赖项不可用,则从本地或远程缓存检索数据,即使数据最终已过期 最终一致性:队列写入(如在SQS中),在依赖项再次可用时继续 存根数据:当无法检索个性化选项时

    66420

    你所不知道的setTimeout

    因此,它们实际上要等到当前脚本的所有同步任务执行完,然后再等到本次Event Loop的“任务队列”的所有任务执行完,才会开始执行。...但是实际上,它只能将上一个字符转为大写,因为浏览器此时还没接收到文本,所以this.value取不到最新输入的那个字符。只有用setTimeout改写,上面的代码才能发挥作用。...由于setTimeout(f,0)实际上意味着,将任务放到浏览器最早可得的空闲时段执行,所以那些计算量大、耗时长的任务,常常会被放到几个小部分,分别放到setTimeout(f,0)里面执行(分片塞入队列...== gid) { clearTimeout(id); } id--; } } })(); 运行上面代码后,实际上再设置任何setTimeout都无效了...如果过了指定时间,没有发生新的keydown事件,将进行Ajax通信将数据发送出去。 这种做法叫做debounce(防抖动)方法,用来返回一个新函数。

    1.8K121

    JS中setTimeout是如何实现的

    我们知道 Javascript引擎是单线程的,而setTimeout方法的作用是延后执行目标代码,同时还可以继续往下执行 setTimeout是如何实现的?...这涉及到了浏览器内核的事件循环模型,在Javascript引擎之外,有一个任务队列,当执行到setTimeout时,延时方法会交给内核其他模块处理(与执行引擎主线程独立),当延时方法到达触发条件,这一延时方法被添加至任务队列里...,执行引擎在主线程方法执行完毕后,会从任务队列中顺序获取任务来执行,这一过程是一个不断循环的过程,称为事件循环模型 下面通过一段示例代码,看一下整个执行过程 console.log('1'); setTimeout...(2)setTimeout test入栈执行 交由webapis处理 ? (3)log('3')入栈执行 ?...(4)在setTimeout方法执行5秒后,timer模块检测到延时处理方法到达触发条件,于是将延时处理方法加入任务队列 ?

    3.4K80

    字节面试:如何实现准时的setTimeout

    最近有同学在面试的时候被问到了这个问题。所以我们利用这篇文章对这个问题进行下解答。 背景 setTimeout 是不准的。...因为 setTimeout 是一个宏任务,它的指定时间指的是:进入主线程的时间。...可以看到随着时间的推移, setTimeout 实际执行的时间和理想的时间差值会越来越大,这就不是我们预期的样子。类比真实的场景,对于一些倒计时以及动画来说都会造成时间的偏差都是不理想的。...setTimeout 系统时间补偿 这个方案是在 stackoverflow 看到的一个方案,我们来看看此方案和原方案的区别 原方案 setTimeout系统时间补偿 当每一次定时器执行时后,都去获取系统的时间来进行修正...依旧非常的稳定,因此通过系统的时间补偿,能够让我们的 setTimeout 变得更加准时,至此我们完成了如何让 setTimeout 准时的探索。

    60110

    javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景「建议收藏」

    在今天之前我一直以为setTimeout这个函数是异步的,无意中看到了一篇关于setTimeout的文章。发现自己曾经的认识全是错误的,赶紧总结下。...:先打印2后打印1,我们在setTimeout里面指定了0ms,希望能马上执行,可是实际上没有效果。...如今我们知道了setTimeout的原理了,如今看下setTimeout(0)的使用场景。以下这个样例来自这篇文章。...这里事实上涉及2个任务,1个是将键盘输入的字符回写到输入框中。一个是获取文本框的值将其写入div中。第一个是浏览器自身的默认行为。一个是我们自己编写的代码。非常显然。...改变顺序,这这正是setTimeout(0)的作用。

    67110

    关于setTimeout和setInterval的函数参数问题

    今天在写验证码倒计时小demo时,用了如下代码: window.setTimeout(count(num),1000); 这样直接使用将使count函数立即执行,并将返回值传递给setTimeout函数作为参数...,其结果并不是真正需要的,所以会出现问题。...方法一 使用字符串形式可以达到想要的结果: window.setTimeout("count(num)",1000); 这是我以前常用的方法。 但这种写法是将函数包在引号里,有点像字符串,不够直观。...在 window.setTimeout函数中,使用_count(30)来返回一个不带参数的函数,此时不需要用引号也实现了参数传递的功能。...其实还可以直接写成: window.setTimeout(function(){count(30);},1000); 另外也有人通过修改setTimeout、setInterval来实现。

    2K20

    重新认识javascript的settimeout和异步

    今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案。但是原因到底是什么呢?...然后看了一下文章下面的评论,发现5楼和6楼的回答很有道理,主要意思就是说javascript引擎是单线程执行的,while循环那里执行的时候,settimeout里面的函数根本没有执行的机会,这样while...但是单纯看还是不怎么踏实,最后发挥实践精神,自己动手做了两个实验: 1、简单的settimeout setTimeout(function () { while (true) { } }...也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的。...jsonObject = "{\"message\":\"" + action + "\"}"; context.Response.Write(jsonObject); } 理论上,

    98390

    js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法

    setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间) setTimeout(表达式,交互时间) 延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTimeout...(test,1000); 总结: setTimeout的原型是这样的: iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])...那我们可以想象一下这个setTimeout是怎样被定义的: setTimeout是window的一个方法,全称是这样的:window.setTimeout() 那应该是这样被定义的:...但实际上, 并非如此, 既然JS给出了两个不同的命名, 肯定有其迥异之处....先来看看两者JS手册及英文词典上的解释: JS手册»setTimeout() : 用于在指定的毫秒数后调用函数或计算表达式; 英文释义»timeout() : 超时;暂时休息;工间休息; JS手册

    3.1K10

    setImmediate() vs setTimeout() 在 JavaScript 中的区别

    但如果你曾经一起运行它们,你可能会注意到一些有趣的行为。 尽管它们的目的相似,但 setImmediate() 和 setTimeout() 在底层的操作方式不同。...理解这两个函数之间的差异将帮助你更好地控制代码的时间和执行顺序,这对于大型应用程序尤其重要,因为即使是时间上的微小失误也可能导致难以发现的错误。...但你在控制台中看到的是: setTimeout 1 setImmediate 1 setImmediate 2 setTimeout 2 如果这让你感到困惑,不要担心。让我们解开其中的原因。...setTimeout() 的 0 延迟 当你使用 setTimeout() 并设置延迟为 0 时,你实际上是在告诉 Node.js 在当前操作完成后尽快运行回调。...setImmediate() 和 setTimeout() 的行为可能取决于代码中发生的其他异步操作。

    11810
    领券