模块循环调用
你有没有想过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的状态,