JavaScript中的异步

本文详细介绍了JavaScript中的异步编程,包括同步与异步的概念、JS为何采用单线程及异步设计的原因、事件循环机制及其流程。文章还探讨了实现异步的各种方式,如回调函数、Promise、发布/订阅、生成器函数以及async/await,并对相关知识点进行了深入解析,如回调函数的this指向问题、Promise的状态与使用、Generator函数的协程实现以及async函数的基本用法。
摘要由CSDN通过智能技术生成

一、什么叫异步?

在JS中有同步和异步两种模式

1、同步(Synchronous)
  • 一般指后一个任务等待前一个任务结束,程序的执行顺序与任务的排列顺序是一致的
2、异步(Asynchronous)
  • 每一个任务有一个或多个回调函数,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务·结束就执行;所以程序的执行顺序与任务的排列顺序是不一致的;
  • 另一种简单的解释:一个任务分两段,先执行第一段,再执行其他任务;当第一段有执行结果时,回去执行第二段

二、JS中为什么要设计异步??

JS是单线程,设计异步可以提高CPU的利用率;但增加了开发难度

1、JS为什么要设计成单线程???

单线程:即同一时间只能做一件事情;JS作为脚本语言,主要的作用是与用户互动、操作DOM,这决定了JS只能是单线程的;否则会带来很复杂的同步问题;

比如:当JS是多线程的,存在有两个线程A、B,线程A想要删除dom1,线程B想要在dom1添加内柔,此时就出现了冲突,不知道应该执行哪个线程的操作。

HTML5提出Web Worker标准允许脚本创建多个线程,但是子线程完全受主线程的控制且不得操作DOM;因为该新标准并没有改变JS单线程的本质

三、事件循环 Event Loop

主线程:JS的首要任务,可以理解为同步任务,先进先出;
执行栈:执行栈是一个先入后出的数据结构,一个同步任务来了进入栈底马上执行它,然后释放;
任务队列:任务队列的存在是为了应付一些异步任务,在执行一个任务如何迟迟等不到不能一直等待,必须让程序接着往下进行;任务队列用于存放这些任务;先进先出;
宏任务:较常见的:script全部代码、setTimeout、setInterval、setImmediate、I/O、UI Rendering
微任务:较常见的:Process.nextTick、Promise(new Promise的过程属于同步任务,resove或者reject之后才算微任务)

Event Loop的流程
  1. 主线程首先按照顺序执行同步任务,将所有同步任务处理完;
  2. 查看微任务队列里是否存在微任务,若存在;将所有微任务队列按顺序执行掉
  3. 查看宏任务队列是否存在宏任务,若存在先把第一个宏任务执行掉
  4. 一直重复步骤2 、3,直到所有微任务和宏任务执行完毕
console.log('script start'); //同步任务

setTimeout(function() {
   
  console.log('setTimeout');//宏任务
}, 0);

Promise.resolve().then(function() {
   
  console.log('promise1');//微任务
}).then(function() {
   
  console.log('promise2');  //微任务
});

console.log('script end');//同步任务
//根据事件循环规则,结果是:script start、script end、promise1、promise2、setTimeout

四、实现异步的方式

ES6诞生以前,异步编程的方法大概有:回调函数、事件监听、发布/订阅、Promise对象
ES6诞生之后,Generator函数将异步编程带入了一个新阶段

1、回调函数

异步编程最基本的方法就是回调函数;回调函数是一段可执行的代码段,它作为一个参数传递给其他代码,其作用是在需要的时候方便调用这段代码(回调函数)。“作为参数传递到另一个函数中,这个参数的函数就是回调函数”
特点:

  1. 不会立即执行:回调函数在调用函数数中也要通过()运算符调用才会执行
  2. 是一个闭包
  3. 执行前会判断是否是一个函数
function add(num1, num2, callback) {
   
            var sum = num1 + num2;
            if (typeof callback === 'function') {
   
               //callback是一个函数,才能当回调函数使用
               callback(sum);
           }
}
function print(num) {
   
    console.log(
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值