当前位置: 首页 > wzjs >正文

四字母域名建设网站可以吗免费的网页设计成品详解

四字母域名建设网站可以吗,免费的网页设计成品详解,蜜桃传奇免费网页版,优秀的wordpress涉及前言 在前端开发中,事件循环(Event Loop) 是一个非常重要的概念。它决定了JavaScript代码的执行顺序,尤其是在处理异步任务时(比如定时器、网络请求、Promise等)。 今天,我们将深入探讨浏览器…

前言

在前端开发中,事件循环(Event Loop) 是一个非常重要的概念。它决定了JavaScript代码的执行顺序,尤其是在处理异步任务时(比如定时器、网络请求、Promise等)。

今天,我们将深入探讨浏览器的事件循环机制,尤其是宏任务(Macro Task)和微任务(Micro Task)的区别与执行顺序,并补充 async/await 的知识点。


一、什么是事件循环?

JavaScript是单线程的,这意味着它一次只能执行一个任务。为了处理异步操作(比如定时器、网络请求等),浏览器引入了事件循环机制。

事件循环的核心思想是:不断地从任务队列中取出任务并执行

事件循环的工作流程可以简单概括为以下几个步骤:

  1. 执行同步代码。

  2. 执行微任务队列中的所有任务。

  3. 执行一个宏任务。

  4. 重复上述过程。


二、宏任务和微任务

1. 宏任务(Macro Task)

宏任务是指那些由浏览器发起的任务,通常包括:

  • setTimeoutsetInterval 定时器

  • DOM事件(如点击事件)

  • requestAnimationFrame

  • I/O操作(如文件读取)

  • setImmediate(Node.js环境)

2. 微任务(Micro Task)

微任务是指那些由JavaScript引擎发起的任务,通常包括:

  • Promisethencatch 回调

  • MutationObserver(用于监听DOM变化)

  • process.nextTick(Node.js环境)

  • async/await 中的异步操作(本质上是Promise)

3. 执行顺序

事件循环的核心规则是:每次执行一个宏任务后,都会清空微任务队列。也就是说,微任务的优先级高于宏任务。

三、async/await 是什么?

async/await 是ES7引入的语法糖,用于简化Promise的使用。

它让异步代码看起来像同步代码,更容易理解和维护。

1. async 函数

  • async 声明的函数会自动返回一个Promise对象。

  • 如果函数内有返回值,返回值会被包装成Promise的 resolve 值。

  • 如果函数内抛出错误,错误会被包装成Promise的 reject 值。

async function foo() {return 'Hello';
}
foo().then(result => console.log(result)); // 输出: Hello

2. await 关键字

  • await 只能在 async 函数中使用。

  • await 会暂停当前 async 函数的执行,等待后面的Promise完成。

  • 如果Promise成功,await 会返回Promise的 resolve 值。

  • 如果Promise失败,await 会抛出异常,可以通过 try/catch 捕获。

async function bar() {let result = await Promise.resolve('World');console.log(result); // 输出: World
}
bar();

四、async/await 与事件循环

async/await 本质上是基于Promise的,因此它属于微任务。当 await 后面的Promise完成时,await 之后的代码会被放入微任务队列中,等待当前宏任务执行完毕后执行。

示例1:async/await 与微任务

console.log('同步代码开始');
​
async function asyncFunc() {console.log('async函数开始');await Promise.resolve();console.log('await之后的代码');
}
​
asyncFunc();
​
console.log('同步代码结束');

输出结果:

同步代码开始
async函数开始
同步代码结束
await之后的代码

分析:

  1. 同步代码:首先执行所有的同步代码,输出 同步代码开始async函数开始

  2. awaitawait 会暂停 asyncFunc 的执行,将 await 之后的代码放入微任务队列。

  3. 同步代码继续:继续执行同步代码,输出 同步代码结束

  4. 微任务:最后执行微任务队列中的任务,输出 await之后的代码


示例2:async/await 与宏任务、微任务的混合

console.log('同步代码开始');
​
setTimeout(() => {console.log('setTimeout 宏任务');
}, 0);
​
async function asyncFunc() {console.log('async函数开始');await Promise.resolve();console.log('await之后的代码');
}
​
asyncFunc();
​
Promise.resolve().then(() => {console.log('Promise 微任务');
});
​
console.log('同步代码结束');

输出结果:

同步代码开始
async函数开始
同步代码结束
await之后的代码
Promise 微任务
setTimeout 宏任务

分析:

  1. 同步代码:首先执行所有的同步代码,输出 同步代码开始async函数开始

  2. awaitawait 会暂停 asyncFunc 的执行,将 await 之后的代码放入微任务队列。

  3. 同步代码继续:继续执行同步代码,输出 同步代码结束

  4. 微任务:执行微任务队列中的任务,输出 await之后的代码Promise 微任务

  5. 宏任务:最后执行宏任务队列中的任务,输出 setTimeout 宏任务

示例3:复杂的微任务和宏任务嵌套

console.log('同步代码开始');Promise.resolve().then(() => {console.log('Promise 微任务1');setTimeout(() => {console.log('setTimeout 宏任务1');}, 0);
});setTimeout(() => {console.log('setTimeout 宏任务2');Promise.resolve().then(() => {console.log('Promise 微任务2');});
}, 0);console.log('同步代码结束');

输出结果:

同步代码开始
同步代码结束
Promise 微任务1
setTimeout 宏任务2
Promise 微任务2
setTimeout 宏任务1

分析:

  1. 同步代码:首先执行所有的同步代码,输出 同步代码开始 和 同步代码结束

  2. 微任务:然后执行微任务队列中的任务,输出 Promise 微任务1,并在微任务中注册了一个新的宏任务 setTimeout 宏任务1

  3. 第一个宏任务:执行第一个 setTimeout 宏任务,输出 setTimeout 宏任务2

  4. 第二个微任务:在第一个宏任务执行后,清空微任务队列,输出 Promise 微任务2

  5. 第二个宏任务:最后执行在微任务中注册的 setTimeout 宏任务1,输出 setTimeout 宏任务1

 思考题:以下代码的执行顺序是?

console.log('同步代码开始');// 模拟一个异步操作,内部包含宏任务和微任务嵌套
function asyncOperation() {return new Promise((resolve) => {setTimeout(() => {console.log('asyncOperation 中的 setTimeout 宏任务');Promise.resolve().then(() => {console.log('asyncOperation 中的 Promise 微任务');setTimeout(() => {console.log('asyncOperation 中嵌套的 setTimeout 宏任务');}, 0);});resolve('asyncOperation 完成');}, 0);});
}// 定义一个 async 函数
async function asyncFunction() {console.log('async 函数开始');const result = await asyncOperation();console.log(result);console.log('async 函数结束');
}// 调用 async 函数
asyncFunction();// 宏任务
setTimeout(() => {console.log('外层 setTimeout 宏任务');
}, 0);console.log('同步代码结束');

这道题就当做课后习题留给大家去完成了,欢迎在评论中留下你的答案! 


五、总结

  • 事件循环:JavaScript通过事件循环机制处理异步任务,确保代码的执行顺序。

  • 宏任务:由浏览器发起的任务,如 setTimeoutsetInterval 等。

  • 微任务:由JavaScript引擎发起的任务,如 Promisethen 回调、async/await

  • 执行顺序:每次执行一个宏任务后,都会清空微任务队列。微任务的优先级高于宏任务。

  • async/awaitasync/await 是基于Promise的语法糖,属于微任务。它让异步代码看起来像同步代码,更容易理解和维护。

理解事件循环、宏任务、微任务以及 async/await 的执行顺序,对于编写高效的异步代码非常重要。希望这篇文章能帮你轻松掌握这些概念!

 


文章转载自:

http://NFZPNTxb.hcwLq.cn
http://S3PVbdS5.hcwLq.cn
http://5GPcG73N.hcwLq.cn
http://TIsiooLt.hcwLq.cn
http://Mmpz2hYV.hcwLq.cn
http://KHcIblFR.hcwLq.cn
http://p86P1pHw.hcwLq.cn
http://a9YEiC2l.hcwLq.cn
http://AG5NLx9e.hcwLq.cn
http://7ALH66im.hcwLq.cn
http://I2mToUcn.hcwLq.cn
http://giZ1jHtD.hcwLq.cn
http://vY5L0hqm.hcwLq.cn
http://yn6NUDZB.hcwLq.cn
http://V0Cbif4r.hcwLq.cn
http://X19WkF4o.hcwLq.cn
http://vyLTZrpN.hcwLq.cn
http://tirpTdbe.hcwLq.cn
http://NIzeenr5.hcwLq.cn
http://46wxJAF1.hcwLq.cn
http://mYcuUzUn.hcwLq.cn
http://tGgfX7wO.hcwLq.cn
http://bky4jZ8H.hcwLq.cn
http://ey2pBu2j.hcwLq.cn
http://oI3ei3VC.hcwLq.cn
http://2fXjO7UV.hcwLq.cn
http://6rQWRoGa.hcwLq.cn
http://2XiesalU.hcwLq.cn
http://rpVKGltJ.hcwLq.cn
http://i6iPYtgB.hcwLq.cn
http://www.dtcms.com/wzjs/729515.html

相关文章:

  • 怎么让自己做的网站让别人看到手机网站范例
  • 做网站的图片字虚外贸公司网站多少钱
  • 天津做流产五洲网站北京网站建设华网天下
  • wordpress国主题公园搜索引擎优化员简历
  • 搭建flv视频网站嘉兴网站开发选哪家
  • 概念网站源码一套网站源码多少钱
  • 设计网站页面特效怎么做网址短链接在线生成免费
  • 哪几个小说网站做网编拿的钱多南昌做网站比较好的公司有哪些
  • 网站建设主要工作沈阳祥云医院看男科怎么样
  • 有什么做调查的网站好小程序申请流程
  • 用phpmysql做网站成都房屋装修设计公司
  • 怎么避免网站开发后门免费网线
  • 网站开发 需求wordpress 4.4
  • 照明灯具类企业网站敦煌做网站的公司电话
  • 免费网站生成器微网站营销是什么
  • 凡科网站建设完成下载下载器wordpress demo 安装
  • 免费企业网站建立wordpress amp插件
  • 怎样才能建设网站国外室内设计网站大全
  • win2008搭建php网站wordpress毕设
  • 铁路建设单位网站嘉盛建设集团网站
  • 深圳企业网站建设企业河南国邦卫可生物科技有限公司网站建设
  • 东莞网站制作实力乐云seo黄骅市海边沙滩在哪里
  • 有关大学生做兼职的网站网页源代码下载音乐
  • 公司网站建设gghhhj关键词排行优化网站
  • 北京专门做网站的公司用什么软件做网站好处
  • 网站后台修改的页面不能显示网站建设公司擅自关闭客户网络
  • 做网站有哪些主题玉泉营网站建设
  • wordpress 热门插件台州网站建设seo
  • 蒙自建设网站电子商务网站建设需要做好哪些准备
  • 网站建设外包公司排名品牌推广渠道有哪些