目录
前言
众所周知,Javascript语言的执行环境是"单线程"(single thread),这就导致JS一次只能运行一个任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
提示:以下是本篇文章正文内容,下面案例可供参考
一、JS任务的执行模式
JS单线程
优点:运行速度快,执行环境相对单纯
缺点:若JS执行时间过长,就会导致页面渲染不连贯,加载阻塞
常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。
为了解决这个问题,Javascript语言将任务的执行模式分成两种:
- 同步(Synchronous)
- 异步(Asynchronous)
同步模式:在主线程(执行栈)排队等待的任务,只有等前一个执行完毕才执行下一个
异步模式:不进入主线程而进入“任务队列”的任务,当主线程中的任务运行完了,才会从任务队列取出异步任务放到主线程执行,执行完主线程,再取任务队列任务执行,如此往复。
在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。
在服务器端,如果允许同步执行所有http请求,服务器性能会急剧下降,很快就会失去响应。
二、异步编程的六种方式
1.回调函数方式
最常用的一种方式:
所谓回调函数,就是把一个函数以参数的形式写到函数里,等到重新执行这个任务的时候,再调用这个函数
// 异步请求
ajax(url, () => {
// 请求返回后的处理逻辑
})
// 读取文件
fs.readFile('/etc/shells', function (err, data) {
// 文件读取完毕后的操作
console.log(data);
});
ajax(url, () => {
// 处理逻辑
ajax(url1, () => {
// 处理逻辑
ajax(url2, () => {
// 处理逻辑
})
})
})
- 优点 是简单、容易理解和部署
- 缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱。
总结:回调函数易于实现、便于理解,但是多次回调会导致代码高度耦合