js async
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>debugger VM演示</title> </head> <body> <script> // 业务逻辑:改成异步,模拟长时间业务,不会一瞬间跑完 async function business(){ console.log("业务正在执行......"); // 模拟业务持续15秒,不会一次性跑完 for(let n=0;n<15;n++){ await new Promise(resolve=>setTimeout(resolve,1000)); console.log("业务运行中,已经过",n+1,"秒"); } console.log("业务执行完毕"); } // 反调试定时器,每4秒触发,new Function产生VM debugger setInterval(function(){ const fn = new Function(` debugger; console.log("我是VM脚本里面的debugger"); `); fn(); },4000); //启动业务 business(); </script> </body> </html>async和await是 JS 处理异步代码的语法糖,本质是基于Promise,解决回调地狱,把异步代码写得像同步一样。
异步:不会等一件事做完,直接往下执行,比如请求接口、读取文件、定时器。
1. async 关键字
写在函数前面,这个函数就变成异步函数:
- 函数返回值自动包装成
Promise对象 - 函数内部才可以使用
await,普通函数不能写 await
// 加上 async async function test(){ return 100; } // 返回的是 Promise,不是直接 100 console.log(test()) // Promise { 100 } test().then(res=>console.log(res)) // 1002. await 关键字
只能写在 async 函数里面!不能在普通函数、全局直接用作用:等待 Promise 执行完成,拿到结果,再往下走代码
//模拟一个异步请求 function fetchData(){ return new Promise((resolve)=>{ setTimeout(()=>{ resolve("接口返回的数据"); },2000) }) } async function run(){ console.log("开始"); // 在这里等待2秒,拿到结果再执行下一行 let res = await fetchData(); console.log(res); // 接口返回的数据 console.log("结束"); } run();执行顺序: 1. 打印开始2. 等待 2 秒 3. 拿到数据打印接口返回的数据4. 打印结束
如果不加 await:不会等待,res 拿到的是一个 Promise 对象,不是真实数据。