nodeJs的循环引用

循环引用在平时的开发过程中大家一定碰到过,同样NODE.JS中也会有这个问题,我们做一个测试

1)a.js文件
var b = require('../test/b');
module.exports.a = 1;
console.log('a.js get b:' + b.b);2)b.js文件
var a = require('../test/a');
console.log('b.js get a:' + a.a);
module.exports.b = 2;

以上的例子中我们在a文件中加载了b文件,同时在b文件中也加载了a文件,很明显的循环依赖情况,如果我们执行a.js会发生什么呢?

结果:

"C:\Program Files (x86)\nodejs\node.exe" a.js
b.js get a:undefined
a.js get b:2

从输出我们可以得到执行顺序

1var b = require('../test/b');2var a = require('../test/a');3)console.log('b.js get a:' + a.a);4)module.exports.b = 2;5)console.log('a.js get b:' + b.b);6)module.exports.a = 1;

很明显的发现在(3)的时候a.a并没有生成,所以必然为undefined了!那到底为什么没有生成呢?
node在加载模块的时候会为每个新加载的文件创建一个Module对象(假设为a),这个就是我们在a.js代码中看到的module了。在创建a之 后,node会先将 a放到cache中,然后再对它进行加载操作。也就是说,如果在加载a的过程中,有其他的代码(假设为b)require a.js的话,那么b可以从cache中直接取到a的module,但是这个时候的a是不完整的也就是没有完全加载完毕的 a,所以自然就是undefined了。

解决方法:在node加载完成之后再访问需要访问的内容
修改a.js为

module.exports.a = 1;
var b = require('../test/b');
console.log('a.js get b:' + b.b);

可以看到在a.js的module.exports之后再加载b.js模块,这个时候即使b.js中有引用a.js也是完整的创建并且加载完毕的a.js了
运行结果为:

b.js get a:1
a.js get b:2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值