我们用一个故事来简单地概述异步。小雷想要给孩子买奶粉,所以去了经常买奶粉的地方,发现店前的公告板上写着本周日不上班。小雷不可能一直等到星期一奶粉店开门,所以小雷只好去其他地方给孩子买个尿布然后回家,等到星期一再来看看。奶粉店关门就是一个耗时任务,让买奶粉这件事没办法立刻完成,只有等待,在奶粉店面前死等就是同步。而且既然出来了,通常还会考虑家里还缺什么,比如说尿布不多了,所以就去其他的地方买个尿布再回家。这里放下买奶粉这件暂时无法完成的事情,而去做可以立即完成的事情,比如买尿布,这就是异步。
js是单线程的语言,对于程序一行一行的执行,
对于 JS 最初使用的环境 ———— 浏览器客户端 ———— 就不一样了。因此在浏览器端运行的 js ,可能会有大量的网络请求,而一个网络资源啥时候返回,这个时间是不可预估的。这种情况也要傻傻的等着、卡顿着、啥都不做吗?———— 那肯定不行。
因此,JS 对于这种场景就设计了异步 ———— 即,发起一个网络请求,就先不管这边了,先干其他事儿,网络请求啥时候返回结果,到时候再说。这样就能保证一个网页的流程运行。
var fs = require('fs')
fs.readFile('data1.json', (err, data) => {
console.log(data.toString())
})
对于这种传递过去不执行,等出来结果之后再执行的函数,叫做callback
,即回调函数
实现异步的最核心原理,就是将callback
作为参数传递给异步执行函数,当有结果返回之后再触发callback
执行
开发中比较常用的异步操作有:
- 网络请求,如
ajax http.get
- IO 操作,如
readFile readdir
- 定时函数,如
setTimeout setInterval
最后,请思考,事件绑定是不是也是异步操作?例如$btn.on('click', function() {...})
。这个问题很有意思,我会再后面的章节经过分析之后给出答案,各位先自己想一下。
event-loop 中文翻译叫做“事件轮询”,它是能体现出单线程中异步操作是如何被执行的。