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

JavaScript setTimeout()不会等待执行?

当使用JavaScript的setTimeout()函数时,它不会等待执行。setTimeout()是一个异步函数,它会在指定的延迟时间后执行一个函数,但是在这段时间内,代码不会停止执行,而是继续执行后面的代码。这是因为JavaScript是单线程的,它不能同时执行多个任务。

如果需要在setTimeout()执行后等待某个操作,可以使用async/awaitPromise结合的方式。例如:

代码语言:javascript
复制
async function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function example() {
  console.log('Before delay');
  await delay(1000); // 等待1秒
  console.log('After delay');
}

example();

在这个例子中,delay()函数返回一个Promise对象,当setTimeout()执行后,Promise对象会被解决,从而使await语句后面的代码继续执行。example()函数被定义为async函数,这样它就可以使用await语句。

总之,setTimeout()是一个异步函数,它不会等待执行。如果需要等待某个操作,可以使用async/awaitPromise结合的方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript执行(一):Promise里的代码为什么比setTimeout执行

然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 JavaScript 引擎去执行,此外,我们可能还会提供 API 给 JavaScript 引擎,比如...setTimeout 这样的 API,它会允许 JavaScript 在特定的时机执行。...所以,我们首先应该形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行。...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...宏观和微观任务 JavaScript 引擎等待宿主环境分配宏观任务,在操作系统中,通常等待的行为都是一个事件循环,所以在 Node 术语中,也会把这个部分称为事件循环。

57110

Promise、setTimeout执行顺序

()){ queue.processNextMessage(); } ​ 如果当前没有任何消息queue.waitForMessage 会等待同步消息到达,当完成当前任务后,继续去查看有无需要执行的任务如果需要执行...同步和异步任务 ​ 要了解异步线程我们首先应该明白它的用处,因为js的单线程特性,任务的执行顺序都是依次执行,而当我们在工作中遇到网络请求,前后端交互的时候,你的数据不会马上拿到,这需要时间,如果等拿到数据再执行下面的代码...,这样如果多次请求就会发现加载速度极慢,这样显然不合理,这样就会出现很多次的暂停等待,所以这时候 需要执行异步任务,当我们发起请求时候,采用异步的方式,浏览器检测到其为异步时,就会开辟一个新的进程处理该函数...-同步任务进入主线程,按顺序从上而下依次执行, -异步任务,进入`event table` ,注册回调函数 `callback` , 任务完成后,将`callback`移入`event queue`中等待主线程调用...的执行顺序优先于setTimeout所以由此可知,在异步任务中,微任务优先于宏任务执行,可以看看下图。

62320

JavaScript中Promise里的代码为什么比setTimeout执行

然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 JavaScript 引擎去执行,此外,我们可能还会提供 API 给 JavaScript 引擎,比如...setTimeout 这样的 API,它会允许 JavaScript 在特定的时机执行。...所以,我们首先应该形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行。...在 ES3 和更早的版本中,JavaScript 本身还没有异步执行代码的能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起的任务...宏观和微观任务 JavaScript 引擎等待宿主环境分配宏观任务,在操作系统中,通常等待的行为都是一个事件循环,所以在 Node 术语中,也会把这个部分称为事件循环。

82720

settimeout(fn 0)与Promise的执行顺序

这里涉及到三个“何时”: setTimeout(fn, 0)何时执行 promise函数何时执行 then何时执行 下面我们来一一分析。 1. setTimeout(fn, 0)何时执行?...我们知道,JavaScript是基于事件驱动单线程执行的,所有任务都需要排队,也就是说前一个任务结束,才会去执行下一个任务。...而settimeout(fn, 0)表示立即执行,也就是用来改变任务的执行顺序,要求浏览器”尽可能快“的进行回调。 2. promise何时执行?...可能你还有一个疑惑,那就是为什么then比setTimeout执行的要早呢? 目前有两种原因导致: 1) setTimeout的0是否真的为0?...参考文章: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop http://www.ruanyifeng.com/blog

1.3K30

JavaScript定时调用函数(SetInterval与setTimeout)

setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。...不过这两个函数还是有区别的,setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout执行一次那段代码。...区别:window.setTimeout("function",time);//设置一个超时对象,只执行一次,无周期           window.setInterval("function",time...如果要求在每隔一个固定的时间间隔后就精确地执行某动作,那么最好使用setInterval,而如果不想由于连续调用产生互相干扰的问题,尤其是每次函数的调用需要繁重的计算以及很长的处理时间,那么最好使用setTimeout...setInterval 不断地执行指定代码直到调用clearInterval清除定时器对象 setTimeout 执行一次指定代码,使用clearTimeout清除定时器对象 setInterval和setTimeout

1.4K40

重新认识javascriptsettimeout和异步

今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案。但是原因到底是什么呢?...然后看了一下文章下面的评论,发现5楼和6楼的回答很有道理,主要意思就是说javascript引擎是单线程执行的,while循环那里执行的时候,settimeout里面的函数根本没有执行的机会,这样while...也就是说第一个settimeout执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的。...,也就是1秒后,它回调执行弹出‘ajax’,可是实际情况并非如此,回调函数无法执行,因为浏览器再次因为死循环假死。...结论:根据实践结果,可以得出,javascript引擎确实是单线程处理它的任务队列(能理解成就是普通函数和回调函数构成的队列吗?)的。

94290

网站性能优化(四)利用setTimeout延迟代码执行

众所周知,JavaScript是单线程。当JavaScript和用户界面更新在同一个进程中运行,JavaScript执行必然会阻止UI更新,反之亦然。...一般,可以通过控制JavaScript执行时间(不超过100毫秒)来尽快更新UI,但是,总是有可能需要处理比较复杂的JavaScript程序,这时,可以采用定时器安排代码延迟执行,其能够帮助你把长时间运行的脚步分解成一系列的小任务...一旦执行栈中同步任务执行完毕,系统会读取“任务队列”,按照先入先出顺序,依次执行异步任务。 通过事件轮询机制,异步任务是不会阻塞界面更新,允许UI能够尽快的响应后续变化。...利用Chrome developer timeline分析JavaScript执行顺序: timeline1.png 可见,在UI绘制完毕之前,会执行func1函数中的console.log(XXX)...如果一个JavaScript执行时间非常长,那么我们可以考虑用定时器分解任务,不过,必须满足下面两个条件才适合用setTimeout: 处理过程不需要同步 数据不需要按顺序处理 伪代码如下: function

96010

setTimeout和setInterval执行时间问题

关于setTimeout和setInterval执行时间问题 setTimeout:在指定的毫秒数后,将定时任务处理的函数添加到执行队列的队尾。...etInterval:按照指定的周期(以毫秒数计时),将定时任务处理函数添加到执行队列的队尾。 但是setTimeout()时间设置成0,方法也不会立马执行的。...因为javascript是单线程编程,它把任务放到队列中,不会同步去执行,必须在完成一个任务后才开始另外一个任务。...setTimeout执行只是把任务放到代码中,没有立马去执行,所以说接下去的代码接着跑,直到js这个任务执行完成,才有可能往下执行。...HTML5标准规定 setTimeout的最短时间间隔是4毫秒; setInterval的最短间隔时间是10毫秒。 也就是说,小于10毫秒的时间间隔会被调整到10毫秒

98351

你不知道的Javascript:有趣的setTimeout

为什么不是每次迭代都执行一次setTimeout 大家都知道,JavaScript在ES6出现以前,是没有块状作用域的,这就意味着, 在for循环中用var定义的变量j,其实是属于全局的,即在全局范围内都可以被访问到...那么现在关键的问题在于,为什么整个for循环会先于setTimeout执行,而不是我们正常理解的,一次迭代执行一次。 这就涉及到了JavaScript的核心特性:单线程。...所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。...只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。 而setTimeout,就被JavaScript定义为异步任务。...每次for循环的迭代,都将setTimeout中的回调函数加入任务队列等待执行

709100

你不知道的Javascript:有趣的setTimeout

为什么不是每次迭代都执行一次setTimeout 大家都知道,JavaScript在ES6出现以前,是没有块状作用域的,这就意味着, 在for循环中用var定义的变量j,其实是属于全局的,即在全局范围内都可以被访问到...那么现在关键的问题在于,为什么整个for循环会先于setTimeout执行,而不是我们正常理解的,一次迭代执行一次。 这就涉及到了JavaScript的核心特性:单线程。...所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。...只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。 而setTimeout,就被JavaScript定义为异步任务。...每次for循环的迭代,都将setTimeout中的回调函数加入任务队列等待执行

80740

JavaScript执行机制

JS引擎线程只做一件事情,就是等待JavaScript然后运行它,浏览器同一个Renderer进程中只能有一个JS引擎线程运行,所以我们说JS是严格单线程执行的。...简单说就是当执行到一个http异步请求时,就把异步请求事件添加到异步请求线程,等收到响应(准确来说应该是http状态变化),再把回调函数添加到事件队列,等待js引擎线程来执行宏任务与微任务了解JavaScript...例如setTimeout中的函数则是产出一个宏任务却不会立即执行,会被事件处理线程注册到宏任务Event Table,然后推送到宏任务队列。...当然,文字描述比不上动画更形象:loupe了解到了上述的执行逻辑,我们对JavaScript每一行代码都在什么时间节点执行就有了大致的印象,来看下面一段代码:console.log('start');setTimeout...Promise中的setTimeout延时也是0,会作为宏任务放入到事件处理线程的宏任务队列中,注意,此时还未进入JS引擎线程,且事件处理线程已有两个宏任务正在等待

30122
领券