# 敲黑板!async/await应用和原理
作者:HerryLo (opens new window) 博客原文链接 (opens new window)
这个篇文章是由async/await
继发引起。在JS开发中通过for循环
或者for..of
配合async/await
,既可以实现继发执行(就是按顺序完成异步操作)。具体原因后续再聊,先上示例代码。
# async/await
继发运行
好的!我们先来看下面的示例代码:
function syncTime(delay, res) {
return new Promise((resolve, reject)=> {
setTimeout(()=> {
resolve(res);
}, delay)
})
}
async function main() {
for(let i=0 ;i<10; i++){
let res = await syncTime(1000, i)
console.log(`%c ${res}`, `color: red;`);
}
}
main();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果:会打印0...9
,每停顿1秒打印一次。你可以运行试试,是否是这个结果。如果把syncTime
函数中的setTimeout
替换为异步请求,那么它就可以直接用到项目中;或者通过上面的操作来阻塞代码,让它进入睡眠状态。
在之前我只是把async/await
作为Promise
的升级版来使用,根本不知道有这个操作的,在同事使用后,我翻阅了大神阮一峰 ECMAScript 6 入门 (opens new window),才发现这个操作早已经有了,这并不是什么稀罕玩意,只是我没有发现而已。😂😂以后还是要多看文档,多看资料!!
async/await
只是Promise
的升级版嘛?看到上面的代码,或者已经知道这个特性的同学,肯定会回答不是。应该说,它算是Promise
+Generator
的共同结合版。
# async/await
实现原理
以上文中的代码为示例,我们来看看函数调用时发生了什么?
在循环中每次都会触发下列的过程:调用syncTime
函数,return
出一个Promise
实例,在delay
ms后Promise
实例状态由padding
变为resolved
,代码继续运行,console
再打印数字;循环遍历10次。
等等!!不是应该先直接打印console
,然后才是运行setTimeout
,Js的Event Loop
怎么在这里失效了!到底发生了什么,导致先运行setTimeout
,再运行console
?下面让我们来看看。
# async/await
和生成器
ing...
目前不知道怎么组织语言,算是懒吧,暂时可以参考下面的文章👇
# Promise
关于Promise的解析之前写过一篇文章,可以借鉴,Promise运行流程可以参考
ing...
ps: 微信公众号:Yopai,有兴趣的可以关注,每周不定期更新。不断分享,不断进步
男性,武汉工作,会点Web,擅长Javascript.
技术或工作问题交流,可联系微信:1169170165.