异步

异步

问题

  1. 单线程概念,与异步的关系

  2. event-loop的概念

  3. Promise的基本原理与使用

  4. async/await(与Promise的区别与联系 ES7)

  5. 总结当前JS解决异步的方案

知识点

单线程

单线程

单线程

只有一个线程,同一时间只能做一件事

原因

避免DOM渲染的冲突

JS可以修改DOM解构

JS执行的时候,浏览器DOM渲染会暂停

两段JS也不能同时执行

webworker支持多线程,但是不能访问DOM

解决方案

异步

问题
没有按照书写顺序执行,可读性差

callback不容易模块化

与异步的关系

同步会阻塞代码运行,异步不会

setTimeout

for(var i = 0; i< 5;i++){
setTimeout((function(i){   
    console.log(i)
    })(i), i*1000);
}
// 0 1 2 3 4

使用异步的场景

(需要等待的时候)

定时任务 setTimeout,setInterval

绑定事件 addEventListener(click等等)

网络请求 ajax和img动态加载

event-loop

概念

事件轮询,JS实现异步的具体解决方案

过程

同步代码,直接执行

异步函数先放在异步队列

同步函数执行完毕后,轮询执行异步队列的函数

实例分析与源码

1 setTimeout无延时

setTimeout(function() {
    console.log(100)
})                          //异步队列
console.log(200)            //主进程
2 setTimeout有延时
setTimeout(function() {
    console.log(1)
}, 100)                     //异步队列 100ms后放入

setTimeout(function() {
    console.log(2)
})                          //异步队列 立刻被放入

console.log(3)              //主进程
3 ajax
$.ajax({
    url: './data.json',
    success: function () {
    console.log('a')        //ajax加载完成时放入,时间不可确定
    }
})
setTimeout(function () {
    console.log('b')
}, 100)                     //100ms 后放入
setTimeout(function () {
    console.log('c')        //立即放入
        })
console.log('d')

//d c a b or d c b a

Promise

async/await (ES7)