注: 今日全部是事件循环 ,如有错误请大家指出 我会及时改正
我们的代码分为同步代码和异步代码:
其中异步代码有定时器 ,延时器 ,ajax,Fetch,事件绑定以及promise中的.then和.catch 等等
但是需要注意: promise本身是同步的 但是.then 和 .catch 是异步的
同步代码会直接交给js引擎去工作 ,放入执行栈中立即执行 ,但是异步代码会先放入宿主环境(浏览器或者node)中,不必等待结果,防止阻塞代码,在不阻塞主线程任务执行的时候 ,推送给任务队列。
所以 ,当执行栈中的同步代码执行完毕,会去任务队列中查看是否有异步任务,有的话就按先进先出的原则推送到执行栈中,执行栈反复进行查看执行的这个过程,就叫做事件循环
异步任务分为微任务和宏任务
微任务是有Js引擎发起的 比如说 Promise的 .then,process.nextTick 这种 ,而宏任务是 有宿主环境发起的 比如setTimeOut/setInterval
new Promise((resolve, reject) => {
resolve(1);
new Promise((resolve, reject) => {
resolve(2);
}).then((data) => {
console.log(data);
})
}).then((data) => {
console.log(data);
})
console.log(3);
结果 : 3 2 1
const fn = () =>
new Promise((resolve, reject) => {
console.log(1);
resolve("success");
});
console.log("start");
fn().then(res => {
console.log(res);
});
结果:start 1 success
setTimeout(() => {
console.log(1);
}, 0)
new Promise((resolve, reject) => {
console.log(2); // ==> 2
resolve('p1')
new Promise((resolve, reject) => {
console.log(3); // ==> 3
setTimeout(() => {
resolve('setTimeout2')
console.log(4);
}, 0)
resolve('p2')
}).then(data => {
console.log(data);
})
setTimeout(() => {
resolve('setTimeout1')
console.log(5);
}, 0)
}).then(data => {
console.log(data);
})
console.log(6);
结果:2 3 6 p2 p1 1 4 5
async function async1(){
console.log('async1 star');
await async2();
console.log('async1 end');
}
async function async2(){
console.log('async2');
}
console.log('script star');
setTimeout(function(){
console.log('settimeout');
},0)
async1();
结果 :
script star
async1 star
async2
async1 end
settimeout
注意点:
其实 在第二道题我一直没弄明白为什么 setTomout中的resolve 不再执行了 ,后来自己理解是相当于resolve是一种结果 ,每个.then 只能执行一次?所以 一个promise中的resolve只能匹配第一个resolve?