| macrotask 宏任务 | microtask微任务 |
|---|
| setTimeout | process.nextTick |
| setInterval | Promises |
| setImmediate | Object.observe |
| requestAnimationFrame | - |
| I/O | - |
| UI rendering | - |
JS运行机制
- 循环宏任务的情况下, 每当当前轮宏任务执行完成询问任务队列是否存在任务, 存在执行, 不存在执行下一轮宏任务

- ES6—async + await
async 的函数返回的都是 一个promise对象,也就是说,它会等待你在await的任务完成之后再继续宏任务
async function test() {
await new Promise((res) => {
console.log(1);
res('成功');
}).then(() => {
console.log(2);
})
console.log(3);
}
test();
JS运行机制练习题
题1
function test() {
console.log(1);
setTimeout(() => {
console.log(2);
}, 1);
[3, 4, 5].forEach((ele) => {
new Promise(res => {
res(ele);
}).then(res => {
console.log(res);
})
})
}
test();
题2
function test() {
console.log(1);
setTimeout(() => {
console.log(2);
}, 1);
setTimeout(() => {
console.log(55);
[3, 4, 5].forEach((ele) => {
new Promise((res) => {
console.log(99);
res(ele);
}).then((res) => {
console.log(res);
});
});
}, 0);
}
test();
题3
async function test() {
console.log(1);
setTimeout(() => {
console.log(2);
}, 1);
setTimeout(() => {
console.log(666);
[3, 4, 5].forEach((ele) => {
new Promise((res) => {
res(ele);
}).then((res) => {
console.log(res);
});
});
console.log(6);
}, 0);
await new Promise((res) => {
res(7);
}).then((res) => {
console.log(res);
});
}
test();
题4
console.log("1");
setTimeout(function() {
console.log("2");
process.nextTick(function() {
console.log("3");
});
new Promise(function(resolve) {
console.log("4");
resolve();
}).then(function() {
console.log("5");
});
});
process.nextTick(function() {
console.log("6");
});
new Promise(function(resolve) {
console.log("7");
resolve();
}).then(function() {
console.log("8");
});
setTimeout(function() {
console.log("9");
process.nextTick(function() {
console.log("10");
});
new Promise(function(resolve) {
console.log("11");
resolve();
}).then(function() {
console.log("12");
});
});
题5
Promise.resolve().then(() => {
console.log('1')
setTimeout(() => {
console.log('2')
}, 0)
})
setTimeout(() => {
console.log('3')
Promise.resolve().then(() => {
console.log('4')
})
}, 0)
题6
console.log(1)
setTimeout(function() {
console.log(2);
let promise = new Promise(function(resolve, reject) {
console.log(7);
resolve()
}).then(function() {
console.log(8)
});
}, 1000);
setTimeout(function() {
console.log(10);
let promise = new Promise(function(resolve, reject) {
console.log(11);
resolve()
}).then(function() {
console.log(12)
});
}, 0);
let promise = new Promise(function(resolve, reject) {
console.log(3);
resolve()
}).then(function() {
console.log(4)
}).then(function() {
console.log(9)
});
console.log(5)
题7
console.log("AAAA");
setTimeout(() => console.log("BBBB"), 1000);
const start = new Date();
while (new Date() - start < 3000) {}
console.log("CCCC");
setTimeout(() => console.log("DDDD"), 0);
new Promise((resolve, reject) => {
console.log("EEEE");
foo.bar(100);
})
.then(() => console.log("FFFF"))
.then(() => console.log("GGGG"))
.catch(() => console.log("HHHH"));
console.log("IIII");
setTimeout(function() {
console.log('setTimeout');
})
题8
async function async1() {
console.log("AAAA");
async2();
console.log("BBBB");
}
async function async2() {
console.log("CCCC");
}
console.log("DDDD");
setTimeout(function() {
console.log("FFFF");
}, 0);
async1();
new Promise(function(resolve) {
console.log("GGGG");
resolve();
}).then(function() {
console.log("HHHH");
});
console.log("IIII");
题9
console.log('start');
setTimeout(() => {
console.log('children2');
Promise.resolve().then(() => {
console.log('children3');
})
}, 0);
new Promise((resolve, reject) => {
console.log('children4');
setTimeout(() => {
console.log('children5');
resolve('children6')
}, 0);
}).then((res) => {
console.log('children7');
setTimeout(() => {
console.log('res');
}, 0)
});
题10
- promise的.then()要有resolve()才会执行
const p = function() {
return new Promise((resolve, reject) => {
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 0);
resolve(2)
})
p1.then((res) => {
console.log(res)
})
console.log(3);
resolve(4)
})
}
p().then((res) => {
console.log(res);
})
console.log('end');
博文参考1
博文参考2
JavaScript 运行机制详解:再谈Event Loop
异步讲解