JavaScript事件循环同步任务与异步任务怎么实现

执行栈与任务队列

执行栈

  • 姑且先不说执行栈是什么,先说栈是什么吧。栈就好似一个桶,最先放入的东西肯定是最后拿出来的,就是大家常说的先进后出。

JavaScript事件循环同步任务与异步任务怎么实现

那么执行栈就是把图中的内容块变成代码任务,光说肯定说不明白,还是得上代码:

function fn (count) {            if (count <= 0) return            fn(count - 1)            console.log(count)        }fn(3)

这是一段很简单的递归代码,这里我们直接上图解释(这里其实画的不严谨,栈底应该是全局执行上下文):

JavaScript事件循环同步任务与异步任务怎么实现

js中所有的任务都会在主线程上执行然后形成一个执行栈(请记住这一点!!!)

任务队列

那么队列和栈则是相反的,队列是先进先出的。其实很好理解,和我们平时排队是一个道理,先进入队伍的人肯定先出来。那么任务队列通俗理解就是用来放置异步任务的回调函数的(也请记住这一点!!!)

同步任务与异步任务

先上一点概念性的东西,打个基础:

同步任务

很多人在理解同步任务的时候会被它的语义搞混,其实同步任务不是同步一起执行的。它是要等待上一个执行任务结束才可以执行下一个任务,这里说起来也并不晦涩难懂,但是还是写段简单的代码解释一下:

console.log(1)console.log(2)console.log(3)

代码很简单吧,很明显输出结果是1,2,3,这就是同步代码,那么我们就可以总结了,同步任务就是在主线程上面排队,然后一个一个进入执行栈执行,直到执行栈为空。

异步任务

还是直接举个栗子:

console.log(1)setTimeout(() => {    console.log(2)}, 1000)console.log(3)

这段代码的输出和上面同步代码的输出不一样,它的输出顺序是1,3,2,这就是异步代码,它并不会按照执行顺序去执行,

同样我们用官方话语总结一下:异步任务指的是,不进入主线程、而进入”任务队列”(Event queue)的任务,只有”任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行 如果不理解没有关系,后面说到了事件循环就会醍醐灌顶了。

js的执行机制

先上比较晦涩难懂的概念:

  • 1. 同步任务由JavaScript 主线程按顺序执行。

  • 2. 异步任务委托给宿主环境执行。

  • 3. 异步任务完成后,对应的回调函数会被加入到任务队列中等待执行,任务队列又被分为宏任务队列和微任务队列,优先执行微任务队列,常见的微任务有new Promise().then,常见的宏任务有定时器

  • 4. JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行。

  • 5. JavaScript 主线程不断重复上面的第4 步,在执行回调函数时又会按照上面的四步去执行。

js一直从任务队列中取回调函数,然后放入主线程中执行,这是一个循环不断的过程,所以把它叫做事件循环。

这个还是要简单粗暴的来段代码会更直观一点:

const promise = new Promise((resolve, reject) => {      console.log(1);      setTimeout(() => {          console.log("timerStart");          resolve("success");          console.log("timerEnd");       }, 0);      console.log(2);  });  promise.then((res) => {      console.log(res);  });  console.log(4);

现在我们根据上面的规则一步一步分析这段代码,如果不懂Promise也没有关系,我保证这并不影响你对事件循环的理解。现在你就把自己当成js代码的检察官,要正确把它们放在合适的“位置”

  • 检察官的名列前茅步就是判断哪些是同步代码,哪些是异步代码,OK,首先从上往下看,Promise本身是同步的,所以它应该在主线程上排队,然后继续看pomise.then是个异步任务,并且是属于微任务的,它的回调函数应该在微任务队列中(此时还不在),最后一句输出语句是同步代码,应该在主线程上排队。

  • 第二步,执行主线程上的同步代码,首先有Promise排着队呢,所以先输出1,随后有个定时器,所以应该把它挂起执行,由于它没有时间延迟,所以回调函数直接被放入宏任务队列,继续执行代码,遇到打印,直接输出2。现在主线程还有其他的同步代码不?是不是还有一个输出语句,所以输出4,现在主线程上的同步代码执行完了

  • 第三步读取任务队列,由于微任务队列上没有东西(Promise的状态并没有改变,不会执行promise.then()),所以读取宏任务队列上的回调函数,回调函数进入主线程执行,首先输出timerStart,然后promise状态发生改变,然后又遇到一个输出语句,输出timerEnd。现在主线程上又没有东西了,又得去看任务队列上有没有东西了。

  • 第四步,由于promise状态发生改变了,所以微任务队列上有回调函数了,执行输出语句,res为success,输出success

关于“JavaScript事件循环同步任务与异步任务怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:JavaScript事件循环同步任务与异步任务怎么实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/22257

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云
上一篇 2022年9月1日 下午11:17
下一篇 2022年9月1日 下午11:18

相关推荐

  • 数据库加密有什么用

    数据库加密的主要用途包括:保护数据的安全性、防止未经授权的访问、满足法规要求、防止数据泄露、保证数据的完整性和可靠性。数据库加密是一种安全策略,它可以确保存储在数据库中的敏感信息不被未经授权的用户访问。如果没有正确的密钥,即使数据被盗,也无法解读加密的信息,从而极大地增强了数据的安全性。此外,数据库…

    2024年7月16日
    700
  • 数据库跳板是什么意思

    数据库跳板是一种在网络安全领域常见的术语,是指黑客通过某个已经被控制的数据库,跳转到其他的数据库或系统,以此进行进一步的攻击行为。具体来说,数据库跳板包括以下几个步骤:一、黑客首先找到一个安全漏洞较多、比较容易攻击的数据库,然后利用各种手段将其控制;二、控制后,黑客会在此数据库中植入恶意代码,使其成…

    2024年7月16日
    500
  • 数据库实现了些什么功能

    数据库实现了数据存储、数据检索、数据管理、数据完整性、数据安全、并发控制、备份与恢复等功能。在这些功能中,数据存储是最基础的功能,因为所有的数据操作都依赖于数据存储这一核心功能。数据存储确保了数据的持久化,能够在需要时进行读取和操作,而不会因为系统关闭或故障而丢失数据。数据库系统通过高效的数据存储机…

    2024年7月16日
    300
  • 电信数据库都做些什么工作

    电信数据库的主要工作包括数据存储、数据管理、数据分析、数据安全、数据备份和恢复、数据集成和数据挖掘。数据存储是其核心功能之一,确保大量用户信息、通话记录、账单数据等能够高效、安全地存储。数据管理涉及对这些数据的组织和维护,确保数据的准确性和一致性。数据分析则通过大数据技术对存储的信息进行深度挖掘,帮…

    2024年7月16日
    400
  • 启动数据库用什么软件好

    启动数据库,我们可以选择多种不同的软件,比如MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、SQLite等。每种数据库软件都有其独特的特性和适应的应用场景。例如,MySQL是最受欢迎的关系数据库管理系统,它具有开源、性能高效、成本低、可扩展性好等优点,被广泛应用…

    2024年7月16日
    300
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部