Node.js setImmediate 教程

打印 上一主题 下一主题

主题 991|帖子 991|积分 2973

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Node.js setImmediate 教程

简介

setImmediate() 是 Node.js 情况中的一个函数,用于安排一个回调函数在当前事件循环周期竣过后立刻执行。它提供了一种在当前操作完成后,但在任何 I/O 事件或定时器触发之前执行代码的方法。
根本用法

  1. setImmediate(() => {
  2.   console.log('这段代码将在当前事件循环周期结束后立即执行');
  3. });
  4. console.log('这段代码将先执行');
复制代码
输出结果:
  1. 这段代码将先执行
  2. 这段代码将在当前事件循环周期结束后立即执行
复制代码
setImmediate vs setTimeout vs process.nextTick

这三个函数都用于安排回调的执行,但它们在执行时机上有明显区别:


  • setImmediate(): 在当前事件循环周期竣过后执行,在下一个事件循环开始之前
  • setTimeout(fn, 0): 等待至少 1 毫秒后执行
  • process.nextTick(): 在当前操作完成后立刻执行,以致在事件循环继续之前
例子:
  1. setTimeout(() => {
  2.   console.log('setTimeout');
  3. }, 0);
  4. setImmediate(() => {
  5.   console.log('setImmediate');
  6. });
  7. process.nextTick(() => {
  8.   console.log('nextTick');
  9. });
  10. console.log('主程序');
复制代码
典型输出:
  1. 主程序
  2. nextTick
  3. setTimeout
  4. setImmediate
复制代码
注意:在某些情况下,setTimeout(fn, 0) 和 setImmediate() 的执行次序大概会变化,这取决于当前的执行时机和系统负载。
取消 setImmediate

与 setTimeout 类似,setImmediate() 返回一个对象,可以用 clearImmediate() 方法取消执行:
  1. const immediateId = setImmediate(() => {
  2.   console.log('这段代码不会执行');
  3. });
  4. clearImmediate(immediateId);
复制代码
使用场景

1. 将CPU密集型操作推迟到I/O事件之后

  1. function processBigData(data) {
  2.   // 避免阻塞事件循环
  3.   setImmediate(() => {
  4.     // 处理大量数据
  5.     const result = performHeavyComputation(data);
  6.     console.log('处理完成');
  7.   });
  8. }
复制代码
2. 递归操作而不堆栈溢出

  1. function processItems(items, i = 0) {
  2.   if (i === items.length) return;
  3.   
  4.   // 处理当前项
  5.   console.log(`处理项目 ${items[i]}`);
  6.   
  7.   // 使用setImmediate递归处理下一项,避免堆栈溢出
  8.   setImmediate(() => {
  9.     processItems(items, i + 1);
  10.   });
  11. }
  12. // 处理大量项目
  13. processItems(Array.from({ length: 10000 }, (_, i) => i));
复制代码
3. 确保异步操作次序

  1. function ensureAsync(fn) {
  2.   return function(...args) {
  3.     const callback = args[args.length - 1];
  4.     const newArgs = args.slice(0, -1);
  5.    
  6.     setImmediate(() => {
  7.       try {
  8.         const result = fn(...newArgs);
  9.         callback(null, result);
  10.       } catch (err) {
  11.         callback(err);
  12.       }
  13.     });
  14.   };
  15. }
  16. const asyncOperation = ensureAsync((x) => x * 2);
  17. asyncOperation(5, (err, result) => {
  18.   if (err) {
  19.     console.error(err);
  20.     return;
  21.   }
  22.   console.log(result); // 输出: 10
  23. });
复制代码
浏览器兼容性

setImmediate() 主要在 Node.js 情况中可用。在浏览器中,它仅在一些 IE 版本和 Edge 中原生支持。对于其他浏览器,你可以使用 polyfill 大概使用 MessageChannel 或 setTimeout 作为替代:
  1. // 浏览器中的 setImmediate polyfill
  2. if (!window.setImmediate) {
  3.   window.setImmediate = function(callback, ...args) {
  4.     return setTimeout(() => callback(...args), 0);
  5.   };
  6.   
  7.   window.clearImmediate = function(id) {
  8.     clearTimeout(id);
  9.   };
  10. }
复制代码
注意事项


  • setImmediate() 在 Node.js 中实现得很好,但在浏览器中支持有限
  • 在循环中过度使用 setImmediate() 大概会导致性能题目
  • 对于浏览器情况,可以思量使用 window.requestAnimationFrame() 或 window.requestIdleCallback()
实际应用示例

Node.js HTTP服务器中使用 setImmediate

  1. const http = require('http');
  2. const fs = require('fs');
  3. const server = http.createServer((req, res) => {
  4.   // 读取大文件
  5.   fs.readFile('largeFile.txt', (err, data) => {
  6.     if (err) {
  7.       res.statusCode = 500;
  8.       res.end('服务器错误');
  9.       return;
  10.     }
  11.    
  12.     // 使用 setImmediate 处理数据,确保不阻塞其他请求
  13.     setImmediate(() => {
  14.       const processedData = processData(data);
  15.       res.end(processedData);
  16.     });
  17.   });
  18. });
  19. server.listen(3000);
  20. function processData(data) {
  21.   // 假设这是一个CPU密集型操作
  22.   return data.toString().toUpperCase();
  23. }
复制代码
总结

setImmediate() 是 Node.js 中一个强大的工具,用于控制异步执行的准确时机。它答应你安排回调在当前事件循环完成后立刻执行,在 I/O 和定时器之前。通过正确使用 setImmediate(),你可以制止阻塞事件循环,实现高效的递归,并确保你的代码以最优的方式在 Node.js 情况中执行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表