第二道题

time 46s

  1. console.log(1);
  2. setTimeout(() => {
  3. console.log(2);
  4. }, 10);
  5. new Promise(function (resolve, reject) {
  6. console.log(3);
  7. resolve('');
  8. console.log(4)
  9. }).then(res => {
  10. console.log(5);
  11. })
  12. console.log(6);

image.png

解析

Promise(executor) ,executor执行器 ,是回调函数 ,同步代码, 里面的内容同步执行,这一整段都是同步代码,与resolve意思一样,then里面的回调函数异步执行

  1. console.log(1);
  2. //setTimeout1
  3. setTimeout(() => {
  4. console.log(2);
  5. }, 10);
  6. /**
  7. * Promise(executor) 执行器 回调函数 同步代码 里面的内容同步执行,这一整段都是同步代码,
  8. * 与resolve意思一样
  9. * then里面的回调函数异步执行
  10. */
  11. new Promise(function (resolve, reject) {
  12. console.log(3);
  13. resolve('');
  14. console.log(4)
  15. })
  16. //promise1
  17. .then(res => {
  18. console.log(5);
  19. })
  20. console.log(6);

time 1m10s
执行栈(其实应该叫执行结果)
1、3、4、6
promise1.then cb -> 5
setTimeout1 cb->2

宏任务
setTimeout1
setTimeout1 cb
微任务
promise1.then x
promise1.then cb x

变形1

time 6m02s
因为// resolve(‘’);被注释掉,不会运行,所以then不会执行,promise1不会进入微任务队列

  1. console.log(1);
  2. //setTimeout1
  3. setTimeout(() => {
  4. console.log(2);
  5. }, 10);
  6. new Promise(function (resolve, reject) {
  7. console.log(3);
  8. // resolve('');
  9. console.log(4)
  10. })
  11. //promise1
  12. .then(res => {
  13. console.log(5);
  14. })
  15. console.log(6);

image.png

执行栈(其实应该叫执行结果)
1、3、4、6
setTimeout1 cb->2

宏任务
setTimeout1
setTimeout1 cb
微任务

变形2

time 7m32s
因为运行reject(),promise.then err cb放入微任务队列中,同一个then中,promise then cb与promise.then err cb必定只能放一个进入微任务队列

  1. console.log(1);
  2. //setTimeout1
  3. setTimeout(() => {
  4. console.log(2);
  5. }, 10);
  6. new Promise(function (resolve, reject) {
  7. console.log(3);
  8. // resolve('');
  9. reject('');
  10. console.log(4)
  11. })
  12. //promise1
  13. .then(res => {
  14. console.log(5);
  15. }, () => {
  16. console.log('error', 50);
  17. })
  18. console.log(6);

image.png
image.png

总结

time 9m50s
为什么微任务要在执行栈代码完成后清空,因为这是模拟的异步,js不是真正的异步,真正的异步应该是js执行栈与微任务同时进行,在这里微任务是等js执行栈中代码运行完成,然后再运行。因为等待,微任务有滞后,宏任务滞后性更大。
image.png
微任务、宏任务代码是异步的,它们滞后了,通过滞后模拟了异步,为了不影响js执行栈、gui线程

变形3

time 12m27s
因为一个setTimeout1是延时10ms,经过10ms延时后把setTimeout1 cb放入宏任务队列,setTimeout2是0ms后,把setTimeout2 cb放入宏任务队列,所以肯定是setTimeout2放得快,在setTimeout1 cb前面,setTimeout2 cb先运行
因为是做题,所以每到setTimeout就进入宏任务队列,但标记上延是10s,delay 10,不延时不标

  1. console.log(1);
  2. // setTimeout1
  3. setTimeout(()=>{
  4. // promise2
  5. Promise.resolve().then(()=>{
  6. console.log('p2',2);
  7. })
  8. },10);
  9. new Promise(function(resolve, reject){
  10. console.log(3);
  11. resolve('');
  12. console.log(4);
  13. })
  14. // promise1
  15. .then(res=>{
  16. // setTimeout2
  17. setTimeout(()=>{
  18. console.log('p1',5);
  19. },0);
  20. })
  21. console.log(6);

image.png

执行栈(其实应该叫执行结果)
1、3、4、6
promise1 then cb
setTimeout2 cb -> p1 5
setTimeout1 cb delay10
promise2 then cb ->p2 2

宏任务
setTimeout1
setTimeout1 cb delay10
setTimeout2
setTimeout2 cb x
微任务
promise1
promise1 then cb x
promise2
promise2 then cb x

image.png