先谈JavaScript的异步处理
JavaScript是一门单线程的编程语言,如果不设计异步处理的机制,很容易因为一些耗时较长的I/O而造成线程阻塞,从而给人不好的程序体验。
以前进行异步处理的方式:
回调函数 :可以通过设置一些事件的回调函数(callBack)从而达到异步处理
事件监听 :事件监听基本是基于回调函数的支持
发布/订阅 :发布订阅是一种良好的设计模式,监听发布者的事件从而达到异步处理
Promise对象 :Promise对象可以解决函数回调的嵌套,但是会导致代码的横向发展(链式操作的弊端)
ES7的Async
Async是给函数前面设置的关键字,await
是只能在async
作用域下使用关键字,它可以监听Promise
对象,当Promise
对象的状态改变后,才进行后面的代码操作。
几个优点
- 函数变成良好的纵向
- 代码看起来就像是同步的代码
- 能够进行标准的
try
和catch
操作
//sleep是一个设置的延迟函数
var sleep = function (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
reject() // time 时间后将Promise的状态改为reject
}, time);
})
};
let hello = async() => { //async 作为箭头函数的关键字
try {
console.log('i am 1')
await sleep(3000)
console.log(`this won't happen`)
} catch (err) {
console.log('i am 3')
}
}
hello()
console.log('i am 2')
sleep
是一个延迟函数,调用的时候会在3000
ms之后改变Promise
对象的状态,所以在try
的作用域内会在执行了console.log('i am 1')
之后等待3000
ms,而此时async
作用域的代码会按顺序向下执行,则会执行到console.log('i am 2')
,当在3000
ms之后,Promise
对象状态变为reject
,这时会被catch
检测到,所以不会再执行try
里面的代码,而且执行catch
下的代码