Nodejs模块的循环调用

本文探讨了在Node.js中两个模块互相调用时如何避免死循环的问题。通过实例展示了当a.js尝试加载b.js,而b.js又加载a.js时,Node.js会返回a.js的未完成副本,确保程序继续执行,而不是陷入无限循环。这种机制保护了程序的正常运行,防止资源耗尽。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模块循环调用

你有没有想过nodejs中假如两个模块循环调用是不是就回陷入一个死循环?

你可以尝试创建三个文件:a.js、b.js和main.js,然后运行如下代码:

// a.js
console.log('a 开始');
exports.done = false;
const b = require('./b.js');
console.log('在 a 中,b.done = %j', b.done);
exports.done = true;
console.log('a 结束');

// b.js
console.log('b 开始');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
exports.done = true;
console.log('b 结束');

// main.js
console.log('main 开始');
const a = require('./a.js');
const b = require('./b.js');
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);

试一下你就会发现很快就执行结束了,并没用陷入死循环。运行结果如下:
执行结果截图
当b.js又常识加载a.js时,nodejs为了防止死循环会返回a.js未完成的副本,然后继续把b.js执行完再返回到a.js中执行完a.js。如果你不懂这个未完成的副本是什么的话那我们在b.js中加一行代码,修改b.js为:

// b.js
console.log('b 开始');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
console.log('a.js:',a) // +
exports.done = true;
console.log('b 结束');

然后在运行main.js结果为:
在这里插入图片描述
a.js如果执行完成的话应该为:{ done: true },但是nodejs为了防止死循环会返回a.js未完成的副本,这个未完成的副本就是a.js执行到require('./b.js')这一行的时候a.js的状态,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值