(function () {
var sleep = function (miliSeconds) {
var data = new Date().getTime();
var getNowTime = function () {
return new Date().getTime();
}
while ( getNowTime() < (data + miliSeconds) );
}
console.time('ajax');
console.time('sync');
console.time('setTimeout');
// ajax后台延时3秒
$.post('./json.php').done(function (data) {
// ajax后台sleep(3);
console.timeEnd('ajax'); // Chrome:5015.423ms
console.log(data);
});
// 这个setTimeout怎么是个二等公民呢?
setTimeout(function () {
console.log('settimeout');
console.timeEnd('setTimeout');// Chrome:5025.530ms
}, 1000);
// 执行栈延迟5秒后执行
sleep(5000);
console.timeEnd('sync'); // Chrome:5005.974ms
})();
上面的代码中执行,ajax是延迟3秒
返回,setTimeout延迟1秒
,那么应该是在执行栈结束后先执行早前结束的setTimeout
才对呀。莫非setTimeout
是个二等公民??
我理解错了吗?
javascript是单线程的,你sleep就阻塞了后续事件的执行
setTimeout是把函数放在执行队列的末尾,sleep结束以后主线程才有空去检查setTimeout的队列,此时已经过了5秒,
settimeout
已超时,所以立即执行,结果表现出来就是延时了5秒多一点