22.EventLoop.html 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <!--
  10. js是单线程,同一个时间只能做一件事,执行顺序:自上之下执行。所以,实现异步通过eventLoop。
  11. 机制eventLoop
  12. 事件循环机制。js引擎在一次事件循环中,会先执行js线程的主任务,然后会去查找是否有微任务microtask(promise),
  13. 如果有那就优先执行微任务,如果没有,在去查找宏任务macrotask(setTimeout、setInterval)进行执行
  14. <b>浏览器eventLoop和node eventLoop</b>
  15. js是单线程的,但是ajax和setTimeout在浏览器里面会多开一个线程
  16. <b>宏任务:</b>setTimeout setInterval setImmediate(ie下 生效) MessageChannel(消息通道)
  17. <b>微任务:</b>Promise.then MutationObserver (监听dom节点更新完毕) process.nextTick()
  18. 小结:代码从上到下执行,会先执行同步的代码,再执行微任务,等到宏任务有没有到时间,
  19. 时间到了的宏任务放到宏任务队列,微任务执行完毕之后,
  20. 会从宏任务队列中取出一个宏任务会放到当前的浏览器的执行环境中执行,当前执行环境都执行完毕后,
  21. 会先去清空微任务。
  22. -->
  23. <script>
  24. /**
  25. * eventLoop 事件循环机制 js
  26. * js单线程语言 弱语言类型 执行:自上而下
  27. * 执行逻辑:
  28. * 同步代码
  29. * 异步代码:宏任务 微任务
  30. * 同步 > 微任务 > 宏任务
  31. * 宏任务:setTimeOut setInterVal 事件绑定 IO
  32. * 微任务: promise.then nextTick
  33. */
  34. // setTimeout(function () {
  35. // console.log("1");
  36. // });
  37. // new Promise(function (resolve) {
  38. // console.log("2");
  39. // resolve();
  40. // }).then(function () {
  41. // console.log("3");
  42. // });
  43. // console.log("4");
  44. // console.log(1)
  45. //宏1
  46. // setTimeout(function(){
  47. // console.log(2);
  48. // let promise = new Promise(function(resolve, reject) {
  49. // console.log(7);
  50. // resolve()
  51. // }).then(function(){
  52. // console.log(8)
  53. // });
  54. // },1000);
  55. // //宏2
  56. // setTimeout(function(){
  57. // console.log(10);
  58. // let promise = new Promise(function(resolve, reject) {
  59. // console.log(11);
  60. // resolve()
  61. // }).then(function(){
  62. // console.log(12)
  63. // });
  64. // },0);
  65. // let promise = new Promise(function(resolve, reject) {
  66. // console.log(3);
  67. // resolve()
  68. // }).then(function(){
  69. // console.log(4)//微1
  70. // }).then(function(){
  71. // console.log(9)//微2
  72. // });
  73. // console.log(5)
  74. // 1 3 5 4 9 10 11 12 2 7 8
  75. // console.log('1');
  76. // setTimeout(function() {
  77. // console.log('2');
  78. // new Promise(function(resolve) {
  79. // console.log('4');
  80. // resolve();
  81. // }).then(function() {
  82. // console.log('5')
  83. // })
  84. // })
  85. // new Promise(function(resolve) {
  86. // console.log('7');
  87. // resolve();
  88. // }).then(function() {
  89. // console.log('8')
  90. // })
  91. // setTimeout(function() {
  92. // console.log('9');
  93. // new Promise(function(resolve) {
  94. // console.log('11');
  95. // resolve();
  96. // }).then(function() {
  97. // console.log('12')
  98. // })
  99. // })
  100. // setTimeout(() => {
  101. // console.log(1)
  102. // }, 0)
  103. // new Promise((resolve) => {
  104. // console.log(2)
  105. // resolve()
  106. // }).then(() => {
  107. // console.log(3)
  108. // }).then(() => {
  109. // console.log(4)
  110. // })
  111. // console.log(5)
  112. // const first = () =>
  113. // new Promise((resolve, reject) => {
  114. // console.log(3);
  115. // let p = new Promise((resolve, reject) => {
  116. // console.log(7);
  117. // setTimeout(() => {
  118. // console.log(5);
  119. // resolve(6);
  120. // }, 0);
  121. // resolve(1);
  122. // });
  123. // resolve(2);
  124. // p.then((arg1) => {
  125. // console.log(arg1);
  126. // });
  127. // });
  128. // first().then((arg2) => {
  129. // console.log(arg2);
  130. // });
  131. // console.log(4);
  132. setTimeout(() => {
  133. console.log("0");
  134. }, 0);
  135. new Promise((resolve, reject) => {
  136. console.log("1"); // 1
  137. resolve();
  138. })
  139. .then(() => {
  140. console.log("2"); //微1
  141. new Promise((resolve, reject) => {
  142. console.log("3"); // Promise1
  143. resolve();
  144. })
  145. .then(
  146. () => {
  147. console.log("4");
  148. },
  149. )
  150. .then(
  151. () => {
  152. console.log("5");
  153. },
  154. );
  155. })
  156. .then(
  157. () => {
  158. console.log("6");
  159. },
  160. () => {}
  161. );
  162. new Promise((resolve, reject) => {
  163. console.log("7"); //2
  164. resolve();
  165. }).then(() => {
  166. console.log("8");
  167. });
  168. // 1 7 2 3 8
  169. </script>
  170. </body>
  171. </html>