2020-10-29关于js异步的理解

今天在项目中用到async和await,由于是第一次用到,打算简单了解下异步。
async用来声明函数,单单使用await会报错。await表示等待方法执行完,用来修饰异步方法,
比如项目中的用异步方法获取token,不用await去修饰的话,token的值会是null。

js中的同步和异步
为什么会有同步异步:
首先解释为什么js是单线程:
js涉及到的是对dom结点的操作,如果是多线程,多个线程对同个dom结点操作会导致复杂的同步问题。
在单线程的情况下如果只有同步,那么js在处理一些耗时很长的请求时,等待时间过长会严重影响用户体验,因而需要异步。
因此,JavaScript在设计的时候,就已经考虑到这个问题,主线程可以完全不用等待耗时操作,可以先挂起处于等待中的任务,先运行排在后面的任务,等到文件的读取或ajax有了结果后,再回过头执行挂起的任务,因此,任务就可以分为同步任务和异步任务。

同步任务
同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务,当我们打开网站时,网站的渲染过程,比如元素的渲染,其实就是一个同步任务

异步任务
异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程,当我们打开网站时,像图片的加载,音乐的加载,其实就是一个异步任务
js异步机制
js中存在一个任务队列,用来存放异步任务,当异步任务完成后,就会在任务队列添加一个对应的事件,表示任务执行完毕,就可以进入到主线程的执行栈,但是这时候主线程不一定有空,当主线程处理完其它任务有空时,就会读取任务队列,读取里面有哪些事件,排在前面的事件会被优先进行处理,如果该任务指定了回调函数,那么主线程在处理该事件时,就会执行回调函数中的代码,也就是执行异步任务,
单线程从从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到,直到有新的任务,这就叫做任务循环,因为每个任务都是由一个事件触发的,因此也叫作事件循环
步骤
(1)所有同步任务都在主线程上执行,行成一个执行栈
(2)主线程之外,还存在一个任务队列,只要异步任务有了结果,就会在任务队列中放置一个事件
(3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面还有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
(4)主线程不断的重复上面的第三步

再补充
参考
https://www.cnblogs.com/Yellow-ice/p/10433423.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值