相信大家都有听说js引擎是单线程执行,单线程执行也其实也就是指js执行过程中是从上到下一口气执行完的,线程是操作系统中的最小执行单元,单线程如何实现异步呢?其实再js中的异步必须要配合第三方的API来完成,这个过程是js通知第三方的API去完成一项任务,在这个过程中js继续执行下面的任务,等到第三方的API完成后会将js的回调函数放在浏览器维护的一个任务队列中,待js引擎处理完当前的执行栈后,会去获取任务队列中的执行任务继续压入执行栈去执行。这样是不是不太好理解,根据饥人谷若愚老师的比喻,我稍微加了一些改编,我们可以把自己比作是js执行的主体,我们同一时间智能做一件事情
1.洗衣服 2.订外卖 3.拖地 4.扫地 5.喂猫
如果要完成以上的任务,我们肯定会先把衣服放进洗衣机,然后定时去洗,接着定了一个外卖,这时候衣服由洗衣机洗,外卖有商家在做,快递员配送,我们闲下来了就可以继续完成拖地、扫地、喂猫等任务了,等我们将以上任务都完成之后才能去看洗衣机洗完衣服了没,外卖到了没、如果洗衣机已经洗完了,外卖也放在门口了,我们就可以立即开始晾衣服的工作,然后去吃饭,如果还没有,我们就等着,外卖先来就先吃完,洗衣机先洗完就先晾衣服
在上面的过程中,洗衣服可以比作定时器,晾衣服是定时器中的回调,叫外卖可以比较ajax请求,吃饭是ajax请求的回调,在js开始执行的时候,调用洗衣服api,然后调用ajax api发送请求,这两件事就交给浏览器去做了,js这时候就接着处理后续的同步任务,如果浏览器在这个期间已经完成了洗衣服和拿到了外卖,就会把晾衣服和吃饭两个任务放在一个任务队列中排队,等js执行完前面的任务之后有空了才会查看任务队列,如果其中有任务的话再拿出来执行,这样类比一下是不是就比较好理解了呢