let timer1 = setInterval(function(){
console.log(1)
},1000);
let timer2 = setInterval(function(){
console.log('-----------')
},2000)
结果: 1
-----
1
1
----
1
宏任务先注册 再执行 timer1 timer同时注册 在宏任务队列中 所以到了1秒执行timer1 到了2秒 执行timer2 timer1
为什么timer2在timer1前面 因为timer2先注册了 timer1在1秒的时候执行了完了要重新注册 加入宏任务队列排在后面了
async function f1(){
new Promise(function(resolve,reject){
// resolve(5);
console.log('---------------');
setTimeout(function(){
reject(3333)
},3000)
console.log('----------------===================')
}).catch(function(data){
console.log(data)
})
}
f1().then(function(data){
console.log(data)
})
console.log(111111111111)
async function f1(){
new Promise(function(resolve,reject){
resolve(5);
reject('我是catch)
console.log('---------------');
setTimeout(function(){
reject(3333)
// resolve('settimeout里的resolve')
console.log('------------settiomeou')
},3000)
console.log('----------------===================')
})
.then(function(data){
console.log(data,'我是then1111111111的记过')
return 555555555555555
})
.catch(function(data){
console.log(data,'我是catch的结果');
return 'cathc'
})
.catch(function(data){
console.log(data,'第二个catch')
})
.then(function(data){
console.log(data,'我是then222222222222的记过')
})
return '我是f1返回的结果'
}
f1().then(function(data){
console.log(data,'我是f1里的then')
})
console.log(111111111111)
结果:
---------------
----------------===================
111111111111
5 我是then1111111111的记过
我是f1返回的结果 我是f1里的then
555555555555555 我是then222222222222的记过
(2.几miao后)
------------settiomeou
promise 里的resolve(参数)对应微任务then 和reject(参数)对应微任务catch
这2个任务是互斥的 只能执行其中一个 谁在前就注册then或者catcha微任务
catcha微任务只执行第一个 然后就结束 就是说执行了reject(参数)后就注册第一个catch微任务
then微任务执行完了后本身返回一个promise对象 里面的return 参数等价于resolve(参数)然后又查找对应的then微任务并注册
async是声明这个函数的返回值是promise对象 return 5等价于 Promise.resolve(5)代表成功 对应then微任务
或者return Promise.reject(‘出错了’) 对应catch(function)微任务
上面代码的执行过程先进入到整个代码中这本身就是个宏任务 然后依次执行
先同步任务 声明f1 执行f1 执行console,log(111111)
执行f1的过程中 同步任务创建promise实例 执行resolve(5)后 注册第一个then微任务进微任务队列 执行console.log(’---------------’);
,注册宏任务settiomout 3秒后进入宏任务队列并执行 这里的3秒应该是以当前整体代码从头开始的起点设置为0秒 算的
接着f1().then给这个promise注册一个微任务
当前宏任务中的同任务执行完了 查看微任务队列有
.then(function(data){
console.log(data,‘我是then1111111111的记过’)
return 555555555555555
})
以及f1().then()
依次执行微任务 执行过程中.then(function(data){
console.log(data,‘我是then1111111111的记过’)
return 555555555555555
})返回一个pormise对象
查看有没微任务 有.then(function(data){
console.log(data,‘我是then222222222222的记过’)
})然后又注册加入微任务队列
所以以及f1().then()后面紧跟着then2微任务
依次执行结果就是
5 我是then1111111111的记过
我是f1返回的结果 我是f1里的then
555555555555555 我是then222222222222的记过
微任务都执行完了后进入下一个宏任务 过了2.几秒settimeout进入宏任务队列 事件循环器发现了它 把他弄到执行柞中执行
总结:then微任务是执行一次就返回一个promise对象 并且注册对应的微任务