js 编译代码是先执行同步任务,遇到 settimeout、setInterval 等宏任务时会进入到宏任务队列中等待同步任务执行完毕后,在去宏任务队列中获取任务来执行。
1 2 3 4 5 6 7 8
| setTimeout(() => { console.log("宏任务"); }, 0); Promise.resolve().then((res) => { console.log("微任务"); }); console.log("同步任务");
|
定时器的任务编排
下面代码执行结果为:等待 10000 循环完毕后同时打印出: 倒计时,倒计时 2,倒计时 1
1 2 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
1 2 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 执行而导致页面白屏等待
1 2 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>
|
任务共享内存
1 2 3 4 5 6 7 8 9 10 11 12
| let i = 0; setTimeout(() => { console.log(++i); }, 1000); setTimeout(() => { console.log(++i); }, 1000);
|
进度条体验任务轮询
1 2 3 4 5 6
| .progressBar { height: 30px; background-color: aquamarine; position: absolute; text-align: center; }
|
1
| <div class="progressBar"></div>
|
1 2 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();
|
任务拆分成多个子任务
1 2 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; }
|
1 2 3 4 5
| <div class="box"> <div class="progre"></div> </div> <div class="progretext">0</div> <button onclick="hd()">开始下载</button>
|
1 2 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 微任务处理复杂任务
1 2 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("同步任务");
|