1.背景介绍
JavaScript作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。 这样一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。 好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。
为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。
“同步模式"指后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。
"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务, 而是执行回调函数,后一个任务则是不等前一个任务结束就执行, 所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
2.知识剖析
异步编程方法
异步编程的主要方式是使用回调函数,但是回调函数嵌套形成Callback Hell问题。 Callback Hell 最大的问题是不好写、不好看,以及衍生出来的不好管理,这样的代码不易阅读、管理、重构困难、没有灵活性。
无论是 Promise 还是 generator,亦或者是 async/await,他们所做的任务都是要千方百计地把Callback Hell拉成平整的线性结构,加入语法糖。
1 回调函数 2 事件监听 3 Promise 4 Generation 5 async/await
1 回调函数
异步编程最基本的方法。
假定有两个函数f1和f2,f2等待f1的执行结果。如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数。
function f1(callback){
setTimeout(function () {
// f1的任务代码
callback();
}, 1000);
}
f1(f2);
2 事件监听
另一种思路是采用事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生。
clickEvent.addEventListener("click", function (e) {
console.log("someone is pressing my buttons…");
});
3.常见问题
回调地狱怎么解决
4.解决方案
1 事件监听
2 Promise
Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。Promise是后面新技术的基础,堪称一切异步方案的粘合剂。
5.编码实战
// 证明单线程的一个例子:
var d = new Date;
setTimeout(function () {
console.log(new Date - d);
}, 1000);
while (true)
if (new Date - d > 3000) break;
console.log(new Date - d);
// 一个定时器
function timer(time, callback) {
setTimeout(function () {
callback();
}, time);
}
timer(3000, function () {
console.log(123);
})
console.log(new Date - d);
setTimeout(function () {
console.log(123);
}, 3000);
console.log(new Date - d);
setTimeout(function () {
console.log(1);
console.log(new Date - d);
setTimeout(function () {
console.log(2);
console.log(new Date - d);
setTimeout(function () {
console.log(3);
console.log(new Date - d);
setTimeout(function () {
console.log(4);
console.log(new Date - d);
}, 3000);
}, 3000);
}, 3000);
}, 3000);
console.log(new Date - d);
6.扩展思考
8.更多讨论
问:什么时候使用异步编程
答: 任务耗时很长,后面的任务都必须排队
问:异步编程有几种方法
答:1 回调函数 2 事件监听 3 Promise 4 Generation 5 async/await
问:promise是什么
答:Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。Promise是后面新技术的基础,堪称一切异步方案的粘合剂。