异步 API

  1. setTimeout:在指定的毫秒数后,将定时任务处理的函数添加到执行队列的队尾。
  2. setInterval:按照指定的周期(以毫秒数计时),将定时任务处理函数添加到执行队列的队尾。
  3. queueMicrotask:添加任务到微任务队列

set..只能是异步计时,回调函数还是在js执行线程里面

setInterval Firefox,chrome 会自动调整(setTimeout也会),防止误差时间叠加, 最终误差时间小于1‰秒。

node v6 还不会自动调整。最终误差时间 0‰-3‰ * 总共运行时间

异步意味着需要一个事件来侦听代码运行的结果

缓解UI卡顿:setTimeout(long,0);实时UI变化,异步运算(添加到执行队列后面)

JS 本身是单线程的(worker 就是解决这个问题),无法异步执行,因此我们可以认为setTimeout这类JS规范之外的由运行环境提供的特殊函数做的事情是创建一个平行线程后立即返回,让JS主进程可以接着执行后续代码,并在收到平行进程的通知后再执行回调函数。除了setTimeoutsetInterval这些常见的,这类函数还包括NodeJS提供的诸如fs.readFile之类的异步 API。
另外,我们仍然回到JS是单线程运行的这个事实上,这决定了JS在执行完一段代码之前无法执行包括回调函数在内的别的代码。也就是说,即使平行线程完成工作了,通知JS主线程执行回调函数了,回调函数也要等到JS主线程空闲时才能开始执行。以下就是这么一个例子。
function heavyCompute(n) {
var count = 0,
i, j;

for (i = n; i > 0; --i) {
for (j = n; j > 0; --j) {
count += 1;
}
}
}

var t = new Date();

setTimeout(function () {
console.log(new Date() - t);
}, 1000);

heavyCompute(50000);

-- Console ------------------------------
8520
可以看到,本来应该在1秒后被调用的回调函数因为JS主线程忙于运行其它代码,实际执行时间被大幅延迟。