Skip to content

Latest commit

 

History

History
35 lines (20 loc) · 2.28 KB

yi-bu.md

File metadata and controls

35 lines (20 loc) · 2.28 KB

什么是异步

我们用一个故事来简单地概述异步。小雷想要给孩子买奶粉,所以去了经常买奶粉的地方,发现店前的公告板上写着本周日不上班。小雷不可能一直等到星期一奶粉店开门,所以小雷只好去其他地方给孩子买个尿布然后回家,等到星期一再来看看。奶粉店关门就是一个耗时任务,让买奶粉这件事没办法立刻完成,只有等待,在奶粉店面前死等就是同步。而且既然出来了,通常还会考虑家里还缺什么,比如说尿布不多了,所以就去其他的地方买个尿布再回家。这里放下买奶粉这件暂时无法完成的事情,而去做可以立即完成的事情,比如买尿布,这就是异步。

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 中文翻译叫做“事件轮询”,它是能体现出单线程中异步操作是如何被执行的。