js 编译代码是先执行同步任务,遇到 settimeout、setInterval 等宏任务时会进入到宏任务队列中等待同步任务执行完毕后,在去宏任务队列中获取任务来执行。
| 12
 3
 4
 5
 6
 7
 8
 
 | setTimeout(() => {console.log("宏任务");
 }, 0);
 Promise.resolve().then((res) => {
 console.log("微任务");
 });
 console.log("同步任务");
 
 
 | 
定时器的任务编排
下面代码执行结果为:等待 10000 循环完毕后同时打印出: 倒计时,倒计时 2,倒计时 1
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | 
 
 
 setTimeout(() => {
 console.log("倒计时1");
 }, 2000);
 setTimeout(() => {
 console.log("倒计时2");
 }, 1000);
 
 
 setTimeout(() => {
 console.log("倒计时");
 }, 0);
 for (let a = 0; a < 10000; a++) {
 console.log("");
 }
 
 
 
 
 
 
 | 
promise 微任务处理
运行结果:promise –> 同步任务 –> then –> settimeout
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | setTimeout(() => {console.log("settimeout");
 }, 0);
 new Promise((resolve, reject) => {
 
 console.log("promise");
 resolve();
 }).then((res) => {
 console.log("then");
 });
 console.log("同步任务");
 
 
 
 
 
 
 
 | 
DOM 渲染任务
一般要把 js 放在页面底部处理,这样不会因为等待 js 执行而导致页面白屏等待
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <html lang="en"><head>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <title>Document</title>
 </head>
 
 
 
 
 <body>
 <h2>hello,world</h2>
 </body>
 <script src="./js/1.js"></script>
 </html>
 
 | 
任务共享内存
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | let i = 0;setTimeout(() => {
 console.log(++i);
 }, 1000);
 setTimeout(() => {
 console.log(++i);
 }, 1000);
 
 
 
 
 
 
 | 
进度条体验任务轮询
| 12
 3
 4
 5
 6
 
 | .progressBar {height: 30px;
 background-color: aquamarine;
 position: absolute;
 text-align: center;
 }
 
 | 
| 1
 | <div class="progressBar"></div>
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | function progre() {let i = 0;
 let div = document.querySelector(".progressBar");
 (function run() {
 if (++i <= 100) {
 div.innerHTML = i;
 div.style.width = i + "%";
 setTimeout(run, 10);
 }
 })();
 }
 progre();
 
 
 
 
 
 | 
任务拆分成多个子任务
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | .box {width: 300px;
 height: 20px;
 position: relative;
 border: 1px solid;
 }
 
 .progre {
 position: absolute;
 height: 100%;
 width: 0%;
 background-color: #09c;
 }
 
 | 
| 12
 3
 4
 5
 
 | <div class="box"><div class="progre"></div>
 </div>
 <div class="progretext">0</div>
 <button onclick="hd()">开始下载</button>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | let num = 984755554;let nums = 984755554;
 let count = 0;
 let progrediv = document.querySelector(".progre");
 let progretext = document.querySelector(".progretext");
 function hd() {
 
 for (let i = 0; i < 1000000; i++) {
 if (num <= 0) break;
 count = num--;
 }
 
 
 
 if (num > 0) {
 setTimeout(hd);
 }
 let progrs = (100 - (num / nums) * 100).toFixed(2) + "%";
 progrediv.style.width = progrs;
 progretext.innerHTML = progrs;
 if (num === 0) {
 progrediv.style.background = "#5edc63";
 }
 console.log(progrs);
 }
 
 | 
promisec 微任务处理复杂任务
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | async function hd(num) {
 let res = await Promise.resolve().then((_) => {
 let count = 0;
 for (let i = 0; i < num; i++) {
 count += num--;
 }
 return count;
 });
 console.log(res);
 }
 hd(456845789);
 console.log("同步任务");
 
 
 
 |