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

河南省住房和城乡建设厅网站首页武汉网站建设优化

河南省住房和城乡建设厅网站首页,武汉网站建设优化,今日国际热点新闻,国外一直小猫做图标的网站一、事件循环机制 Node.js 的事件循环分为六个阶段,每个阶段处理不同类型的任务,按顺序执行,且每个阶段结束后会清空微任务队列: // 简化版事件循环流程 1. Timers:执行 setTimeout、setInterval 的回调 2. Pending …
一、事件循环机制

Node.js 的事件循环分为六个阶段,每个阶段处理不同类型的任务,按顺序执行,且每个阶段结束后会清空微任务队列:

// 简化版事件循环流程
1. Timers:执行 setTimeout、setInterval 的回调
2. Pending callbacks:处理系统操作(如TCP错误)的回调
3. Idle/Prepare:Node内部使用
4. Poll:执行I/O回调,检索新事件(可能阻塞)
5. Check:执行 setImmediate 回调
6. Close callbacks:处理关闭事件的回调(如socket.on('close'))

执行特点

  • 每个阶段执行完毕后,会先处理 process.nextTick 队列,再处理 Promise 微任务队列
  • 如果微任务队列被塞满,会导致事件循环阻塞(比如递归调用 process.nextTick
二、微任务与宏任务的区别
类型常见API执行时机
宏任务setTimeout, setInterval事件循环的对应阶段(如Timers阶段)
setImmediate, I/O 操作事件循环的对应阶段(如Check阶段)
微任务process.nextTick每个阶段结束后立即执行(优先级最高)
Promise.then/catch/finally每个阶段结束后,nextTick队列清空后执行

执行顺序口诀
同步代码 > nextTick > Promise > 宏任务

三、代码示例与执行顺序分析
示例1:基础顺序
console.log('同步1');setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));Promise.resolve().then(() => console.log('promise'));
process.nextTick(() => console.log('nextTick'));console.log('同步2');// 输出顺序:
// 同步1 → 同步2 → nextTick → promise → timeout/immediate 顺序可能互换
// 注意:setTimeout 和 setImmediate 在顶层代码中的执行顺序不确定!
示例2:I/O回调中的确定顺序
const fs = require('fs');fs.readFile(__filename, () => {setTimeout(() => console.log('timeout'), 0);setImmediate(() => console.log('immediate')); // 必然先输出process.nextTick(() => console.log('nextTick'));
});// 输出顺序:nextTick → immediate → timeout
// 原因:I/O回调在Poll阶段,setImmediate属于Check阶段,微任务在阶段切换前处理
示例3:微任务递归导致的饥饿问题
function starve() {Promise.resolve().then(() => {console.log('微任务执行');starve(); // 递归调用导致事件循环无法继续处理宏任务});
}starve();
setTimeout(() => console.log('这个永远不会执行'), 0);// 输出:无限打印"微任务执行",setTimeout回调被阻塞
四、日常开发建议
  1. 避免微任务递归
    使用 while 或递归调用 process.nextTick/Promise 会导致事件循环阻塞。

  2. 耗时任务拆分
    将CPU密集型任务拆分成多个宏任务(如用 setImmediate 分片):

    function heavyTask() {let count = 0;function chunk() {while (count < 1e6 && /* 分片条件 */) {// 处理一部分任务count++;}if (count < 1e6) {setImmediate(chunk); // 让出事件循环}}chunk();
    }
  3. 优先使用 setImmediate
    在I/O操作后需要立即执行代码时,setImmediate 比 setTimeout(fn, 0) 更高效:

    fs.readFile('file.txt', () => {setImmediate(() => console.log('立即执行')); // 推荐
    });
  4. 错误处理必须完善
    未捕获的异常会导致微任务队列中断:

    Promise.resolve().then(() => {throw new Error('崩溃');
    }).catch(console.error); // 必须捕获!
五、注意事项
  • 浏览器与Node差异
    浏览器每执行一个宏任务就会清空微任务队列,而Node.js是在每个阶段结束后清空。

  • nextTick 与 Promise 顺序
    process.nextTick 优先级高于 Promise

    process.nextTick(() => console.log('A'));
    Promise.resolve().then(() => console.log('B'));
    // 输出顺序:A → B
  • 定时器精度问题
    setTimeout(fn, 0) 实际延迟至少1ms,而 setImmediate 更“立即”。

六、总结

理解事件循环的阶段性特征和任务队列优先级,能帮助开发者避免性能瓶颈和逻辑错误。在异步编程时,应根据任务类型合理选择微任务或宏任务,并始终注意避免阻塞事件循环。

http://www.cadmedia.cn/news/12170.html

相关文章:

  • 做标书有什么好的网站吗移动广告联盟
  • 湛江建站网络公司产品推广软文300字
  • 新公司成立需要办理哪些手续网络推广seo
  • 网站建设信息最火的网络销售平台
  • 网站维护公司推荐qq群排名优化软件
  • 免费做链接的网站无线网络优化工程师
  • 政府单位网站建设方案书九个关键词感悟中国理念
  • 威海高区有没有建设局的网站搜索引擎优化的工具
  • 网站后端建设云盘搜索
  • 网站建设技术和销售工资莱芜seo
  • 网站建设和web前端一样吗百度一下你就知道搜索引擎
  • 网站制作需要多少费用排名优化公司哪家好
  • 新疆建设厅官网深圳seo排名哪家好
  • 软件公众号开发seo关键词排名优化如何
  • 建设网站招标文件新能源汽车公司
  • 机票便宜网站建设石家庄新闻网
  • 天津建设部网站首页网络营销典型案例
  • 衣柜推拉门图案设计网站seo商学院
  • 苍山网站建设网络营销与策划试题及答案
  • 建一个网站的技术解决方案google搜索排名优化
  • 邢台县教育局五库建设网站枸橼酸西地那非片
  • 网站平台建设投资费用清单我想接app纯注册推广单
  • 专门做租房的网站又一病毒来了比新冠可怕
  • 萝岗营销型网站建设上海好的seo公司
  • 镇江网站建设公司产品推广渠道有哪些方式
  • 做五金上哪个网站推广想开广告公司怎么起步
  • 深圳网站建设 湖南岚鸿安卓优化大师app
  • 客户关系管理案例经典seo的含义是什么意思
  • 网站的音乐怎么做的天津seo推广
  • 电子商务网站建设实训需求分析南京seo优化