
!DOCTYPE html html langzh-CN head meta charsetUTF-8 titledebugger VM演示/title /head body script // 业务逻辑改成异步模拟长时间业务不会一瞬间跑完 async function business(){ console.log(业务正在执行......); // 模拟业务持续15秒不会一次性跑完 for(let n0;n15;n){ await new Promise(resolvesetTimeout(resolve,1000)); console.log(业务运行中已经过,n1,秒); } console.log(业务执行完毕); } // 反调试定时器每4秒触发new Function产生VM debugger setInterval(function(){ const fn new Function( debugger; console.log(我是VM脚本里面的debugger); ); fn(); },4000); //启动业务 business(); /script /body /htmlasync和await是 JS 处理异步代码的语法糖本质是基于Promise解决回调地狱把异步代码写得像同步一样。异步不会等一件事做完直接往下执行比如请求接口、读取文件、定时器。1. async 关键字写在函数前面这个函数就变成异步函数函数返回值自动包装成Promise对象函数内部才可以使用await普通函数不能写 await// 加上 async async function test(){ return 100; } // 返回的是 Promise不是直接 100 console.log(test()) // Promise { 100 } test().then(resconsole.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 对象不是真实数据。