广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript事件循环同步任务与异步任务怎么实现
  • 850
分享到

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

2024-04-02 19:04:59 850人浏览 薄情痞子
摘要

这篇文章主要介绍“javascript事件循环同步任务与异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript事件循环同步任务与异步任务

这篇文章主要介绍“javascript事件循环同步任务与异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: JavaScript事件循环同步任务与异步任务怎么实现

本文链接: https://www.lsjlt.com/news/98673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript事件循环同步任务与异步任务怎么实现
    这篇文章主要介绍“JavaScript事件循环同步任务与异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript事件循环同步任务与异步任务...
    99+
    2022-10-19
  • JavaScript事件循环同步任务与异步任务
    目录前言执行栈与任务队列执行栈任务队列同步任务与异步任务同步任务异步任务js的执行机制结语前言 首先,在学习js中同步异步的问题前,需要明白,js是单线程的,为什么它得是单线程的呢?...
    99+
    2022-11-13
  • JavaScript事件循环同步任务与异步任务实例分析
    本篇内容介绍了“JavaScript事件循环同步任务与异步任务实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!执行栈与任务队列执行栈姑...
    99+
    2023-07-02
  • JavaScript事件循环剖析宏任务与微任务
    目录前言引言为什么会有事件循环?JS是单线程的同步任务和异步任务 JS事件循环宏任务与微任务常见的宏任务有哪些?常见的微任务有哪些?执行过程总结(重点)同步任务 &mdas...
    99+
    2022-11-13
    JavaScript 事件循环宏任务微任务 JavaScript 事件循环
  • JavaScript同步与异步任务问题详解
    目录js会出现异步问题场景标题延时操作开关涵数jQuery异步请求设置为同步请求js会出现异步问题场景 延时操作数据请求同异步promise 异步回调涵数(最常见多内置涵数支持接收回...
    99+
    2022-11-13
  • JavaScript如何实现异步任务循环顺序执行
    今天小编给大家分享一下JavaScript如何实现异步任务循环顺序执行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求场景...
    99+
    2023-07-05
  • JavaScript实现异步任务循环顺序执行详解
    目录一、错误的实现简单的错误实现使用 Promise.all 的错误实现二、正确的实现需求场景:数组的元素作为异步任务的参数,循环遍历该数组,并执行异步任务。 一、错误的实现 简单的...
    99+
    2023-03-19
    JavaScript异步任务循环顺序执行 JavaScript异步任务执行 JavaScript异步任务
  • Django怎么实现异步任务
    本篇内容介绍了“Django怎么实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 对于网站来说...
    99+
    2022-10-19
  • python异步任务怎么实现
    在Python中,可以使用协程(Coroutine)和异步IO来实现异步任务。首先,需要使用`async`关键字定义一个协程函数(C...
    99+
    2023-09-22
    python
  • springboot怎么实现异步任务
    这篇“springboot怎么实现异步任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么实现异步任务...
    99+
    2023-06-29
  • android异步任务怎么实现
    在Android中,可以使用AsyncTask类来实现异步任务。下面是一个简单的示例:1. 创建一个继承自AsyncTask的子类,...
    99+
    2023-08-18
    android
  • springboot定时任务和异步任务怎么实现
    这篇文章主要介绍“springboot定时任务和异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot定时任务和异步任务怎么实现”文章能帮助大家解决问题。异步任务简单案例...
    99+
    2023-06-27
  • JavaScript 事件循环中微任务和宏任务有什么区别
    JavaScript 事件循环中微任务和宏任务有什么区别,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。事件循环:微任务和宏任务浏览器中 Jav...
    99+
    2022-10-19
  • SpringBoot异步任务及并行事务实现
            上一篇介绍了原生Java如何实现串行/并行任务,主要使用了线程池 + Future + CountDownLatch,让主线程等待子线程返回后再向下进行。而在SpringBoot中,利用@Async和AOP对异步任务提供了更...
    99+
    2023-09-05
    java spring boot mysql
  • golang同步执行任务怎么实现
    在Go中,可以通过goroutine和channels来实现任务的同步执行。具体步骤如下: 创建一个通道,用于任务之间的通信。 在...
    99+
    2023-10-22
    golang
  • golang异步任务队列怎么实现
    在Go语言中,可以使用goroutine和channel来实现异步任务队列。下面是一个简单的示例代码: package main ...
    99+
    2023-10-27
    golang
  • JS怎么实现异步任务队列
    本篇内容主要讲解“JS怎么实现异步任务队列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现异步任务队列”吧!问题有个需求,需要实现一个异步任务队列,并...
    99+
    2022-10-19
  • django多线程异步任务怎么实现
    在Django中,可以使用Celery来实现多线程异步任务。首先,需要安装Celery:pip install celery然后,在...
    99+
    2023-10-21
    django
  • celery怎么为不同异步任务分配不同worker
    今天小编给大家分享一下celery怎么为不同异步任务分配不同worker的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2022-10-19
  • golang定时任务中异步回调怎么实现
    在golang中,可以使用goroutine和channel来实现异步回调。 下面是一个示例代码: package main im...
    99+
    2023-10-22
    golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作