摘要:事件循环事件循环是实现异步的一种方法,也是的执行机制。最后的最后是一门单线程语言是的执行机制部分内容转自
1.单线程
javascript是一门单线程语言
2.javascript事件循环同步任务
异步任务
除了广义的同步任务和异步任务,我们对任务有更精细的定义:
macro-task(宏任务):包括整体代码script,setTimeout,setInterval
micro-task(微任务):Promise,process.nextTick(类似node.js版的"setTimeout")
事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。
console.log("1"); setTimeout(function() { console.log("2"); process.nextTick(function() { console.log("3"); }) new Promise(function(resolve) { console.log("4"); resolve(); }).then(function() { console.log("5") }) }) process.nextTick(function() { console.log("6"); }) new Promise(function(resolve) { console.log("7"); resolve(); }).then(function() { console.log("8") }) setTimeout(function() { console.log("9"); process.nextTick(function() { console.log("10"); }) new Promise(function(resolve) { console.log("11"); resolve(); }).then(function() { console.log("12") }) })
结果:整段代码,共进行了三次事件循环,完整的输出为1,7,6,8,2,4,3,5,9,11,10,12。
(请注意,node环境下的事件监听依赖libuv与前端环境不完全相同,输出顺序可能会有误差)
浏览器和Node 环境下,microtask 任务队列的执行时机不同
Node端,microtask 在事件循环的各个阶段之间执行
浏览器端,microtask 在事件循环的 macrotask 执行完之后执行
例子:
setTimeout(()=>{ console.log("timer1") Promise.resolve().then(function() { console.log("promise1") }) }, 0) setTimeout(()=>{ console.log("timer2") Promise.resolve().then(function() { console.log("promise2") }) }, 0)
浏览器端运行结果:timer1=>promise1=>timer2=>promise2
Node端运行结果分两种情况:
如果是node11版本一旦执行一个阶段里的一个宏任务(setTimeout,setInterval和setImmediate)就立刻执行微任务队列,这就跟浏览器端运行一致,最后的结果为timer1=>promise1=>timer2=>promise2
如果是node10及其之前版本:要看第一个定时器执行完,第二个定时器是否在完成队列中。
如果是第二个定时器还未在完成队列中,最后的结果为timer1=>promise1=>timer2=>promise2
如果是第二个定时器已经在完成队列中,则最后的结果为timer1=>timer2=>promise1=>promise2
递归执行:
简单来说就是在 then 方法里面递归传递下一次异步方法:then(next())
循环调用:
这种办法比较取巧,直接利用 Promise.resolve()。通过循环赋值,得到最终的结果。
5.为何try里面放return,finally还会执行 6.如何在保证页面运行流畅的情况下处理海量数据大致的执行流程是:
用ajax获取到需要处理的数据, 共13万条
将数组分组,每组500条,一共260组
循环这260组数据,分别处理每一组数据, 利用setTimeout函数开启一个新的执行线程(异步),防止主线程因渲染大量数据导致阻塞。
总结: (1)js的异步我们从最开头就说javascript是一门单线程语言,不管是什么新框架新语法糖实现的所谓异步,其实都是用同步的方法去模拟的,牢牢把握住单线程这点非常重要。
(2)事件循环Event Loop事件循环是js实现异步的一种方法,也是js的执行机制。
(3)javascript的执行和运行执行和运行有很大的区别,javascript在不同的环境下,比如node,浏览器,Ringo等等,执行方式是不同的。而运行大多指javascript解析引擎,是统一的。
(4)setImmediate微任务和宏任务还有很多种类,比如setImmediate等等,执行都是有共同点的,有兴趣的同学可以自行了解。
(5)最后的最后javascript是一门单线程语言
Event Loop是javascript的执行机制
部分内容转自:
1).https://juejin.im/post/59e85e...
2).https://juejin.im/post/5b30b0...
3).https://zhuanlan.zhihu.com/p/...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/104972.html
摘要:异步任务必须指定回调函数,当异步任务从任务队列回到执行栈,回调函数就会执行。事件循环主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为。事件循环事件循环是指主线程重复从消息队列中取消息执行的过程。 参考链接:这一次,彻底弄懂 JavaScript 执行机制https://zhuanlan.zhihu.com/p/...从浏览器多进程到JS单线程,JS运行机制...
摘要:主线程不断重复上面的三步,此过程也就是常说的事件循环。所以主线程代码执行时间过长,会阻塞事件循环的执行。参考资料这一次,彻底弄懂执行机制任务队列的顺序机制事件循环搞懂异步事件轮询与中的事件循环 1. 说明 读过本文章后,您能知道: JavaScript代码在浏览器中的执行机制和事件循环 面试中经常遇到的代码输出顺序问题 首先通过一段代码来验证你是否了解代码输出顺序,如果你不知道输出...
摘要:主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为事件循环。上面也提到,在到达指定时间时,定时器就会将相应回调函数插入任务队列尾部。这就是定时器功能。关于定时器的重要补充定时器包括与两个方法。 一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: console.log(1); setTimeout(function()...
摘要:主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为事件循环。上面也提到,在到达指定时间时,定时器就会将相应回调函数插入任务队列尾部。这就是定时器功能。关于定时器的重要补充定时器包括与两个方法。 一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: console.log(1); setTimeout(function()...
摘要:主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为事件循环。上面也提到,在到达指定时间时,定时器就会将相应回调函数插入任务队列尾部。这就是定时器功能。关于定时器的重要补充定时器包括与两个方法。 一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: console.log(1); setTimeout(function()...
阅读 2884·2021-11-23 09:51
阅读 3118·2021-11-12 10:36
阅读 3158·2021-09-27 13:37
阅读 3130·2021-08-17 10:15
阅读 2561·2019-08-30 15:55
阅读 2701·2019-08-30 13:07
阅读 768·2019-08-29 16:32
阅读 2614·2019-08-26 12:00