1.关于异步的几个概念
(1)触发和执行不是一个意思
计数器的回调函数一定会在指定的delay后触发,但此时不一定立即执行,可能需要等待(等待所需的资源的释放)
(2)事件队列
onclick等由浏览器的内核DOM binding模块处理,当事件触发时,立即加入任务队列
setTimeout由timer模块进行延时处理,当时间到达时,它的回调才被加入任务队列
ajax由network模块处理,当网络请问完成时,回调才被加入任务队列
(3)setTimeout,setInterval
setTimeout是delay一定时间后将回调加入任务队列,而setInterval是每隔一定时间后将回调加入任务队列,但是如果此时任务队列里还有此回调,则会忽略此次,所以setInterval可能会出现中间某次没有执行的情况
(4)事件循环
js会创建一个类似while的循环,每次tick查看是否有待处理的事件,如果有就取出并放入主线程执行
(5)在es6,新增的任务队列,如(promise)优先级比任务队列优先级更高
2.promise
以前对于异步处理,我们都是通过回调来处理,将回调拆解成一个个的function,或者使用事件发布/监听模式等多种方式来处理较复杂的异步,
现在es6给出了新的解决方案,promise,对于不支持promise的IE11和Opera Mini,我们使用polyfill可处理,es6-promise
(1) promise内部实现了resolve和reject这两个回调,通过它们可修改promise对象的状态,将异步操作的结果通过参数传递出去
