持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
异步模式:简单来说就是让代码执行更加的高效,预防事件阻塞。
1. 同步的概念
在了解异步代码之前,我们先了解一下同步的概念,同步模式就是在任务执行时,会等待前一个任务执行完毕,代码的执行顺序与任务排列的顺序是一致的。此时,如果出现了可能十分耗时的任务,就会影响后续任务的执行,造成事件阻塞。因此,我们引出异步的概念。
2. 异步的概念
异步代码每一个任务都有一个或多个回调函数,当前任务执行完毕之后不会去执行后续任务,而是执行回调函数。任务的执行也无需等待前一个任务的结束,所以此时代码的执行顺序与任务排列的顺序并不一致,执行结果会在任务完成后显示.
3. 异步的运行机制
由于 JavaScript 单线程(一次执行一行代码)的特点,为了防止耗时的代码不会阻塞后续代码的执行,引入了一个事件循环(EventLoop)的并发模型,即收集异步任务和执行代码的模型。
<body>
<button class="btn">点我</button>
<script>
// 目标:回答代码执行和打印的顺序
const result = 0 + 1
console.log(result)
setTimeout(() => {
console.log(2)
}, 2000)
document.querySelector('.btn').addEventListener('click', () => {
console.log(3)
})
document.body.style.backgroundColor = 'pink'
console.log(4)
</script>
</body>
// 打印顺序:1 4 2 3
JavaScript中代码的执行主要分为三个步骤:
(1)执行同步代码,当遇到异步代码时交给宿主浏览器环境执行
(2)异步有结果后,把回调函数放到任务队列中排队
(3)当调用栈空闲之后,调用任务队列里的回调函数
事件循环过程
4. 异步模式编程的4种方法
1、回调函数
将任务的后续封装在一个函数里,当重新执行任务的时就会调用该函数。值得注意的是,如果嵌套的回调函数过多,就会出现整个代码块非常复杂的情况,此时代码的可读性大大降低,并且代码的耦合性很强,非常不利于修改,还会出现无法捕获异常的情况,这个情况我们称之为“回调函数地狱”。
2、发布订阅模式,也叫观察者模式
该模式下定义了一种1对多的模式,一个主体对象面对多个观察者对象,观察者订阅该主题对主题对象进行监听,观察者能够收到来自主题对象发布的信息。
3、 事件监听
实现的原理也是利用定时器,将代码块放入任务队列中,等待全部执行完毕之后,再去调用任务队列中的方法。此时任务的执行不在取决于代码的顺序,而是取决于事件是否发生。
4、Promise对象
Promise的出现解决了回调函数地狱的问题,它的特点是将异步代码以同步代码的形式表达出来,避免了层层嵌套,提高了代码的可读性。 其主要依靠 then()方法返回一个新的 Promise 对象,将任务环串联起来直到结束。