在类NodeJS 4中处理循环依赖关系

在做module.exports = <ClassName>的时候,我有一个循环依赖的问题。

这是一个例子。 ClassC要求ClassB,ClassB要求ClassA,ClassA要求ClassC。 在main.js中,我们只是创build一个新的ClassC实例并调用该方法,它将执行一系列调用:

/* classA.js */ 'use strict'; const ClassC = require('./classC.js'); class ClassA { foo() { console.log('ClassA.foo'); var classC = new ClassC(); classC.bar(); } } module.exports = ClassA; /* classB.js */ 'use strict'; const ClassA = require('./classA.js'); class ClassB { foo() { console.log('ClassB.foo'); var classA = new ClassA(); classA.foo(); } } module.exports = ClassB; /* classC.js */ 'use strict'; const ClassB = require('./classB.js'); class ClassC { foo() { console.log('ClassC.foo'); var classB = new ClassB(); classB.foo(); } bar() { console.log('ClassC.bar'); } } module.exports = ClassC; /* main.js */ 'use strict'; const ClassC = require('./classC.js'); var classC = new ClassC(); classC.foo(); 

所以,当我打电话给节点main.js我得到一个明显的错误,没有解决ClassC。

 D:\Projects\test-circular-reference-es6\classA.js:8 var classC = new ClassC(); ^ TypeError: ClassC is not a function at ClassA.foo (D:\Projects\test-circular-reference-es6\classA.js:8:22) at ClassB.foo (D:\Projects\test-circular-reference-es6\classB.js:9:16) at ClassC.foo (D:\Projects\test-circular-reference-es6\classC.js:9:16) at Object.<anonymous> (D:\Projects\test-circular-reference-es6\main.js:7:8) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Function.Module.runMain (module.js:441:10) at startup (node.js:139:18) 

发生这种情况是因为在ClassA中需要ClassC时,它仍然是一个ClassC加载的过程,所以返回一个空对象,稍后在classC.js的末尾,将Class.exports用ClassC覆盖,同时引用classA中的空对象。 js保持原样。

所以问题是如何处理这个问题,在NodeJS 4.x(ES6)中同时具有循环引用和导出类的最佳做法是什么?

从我身边我看到以下可能的方式:

  1. 不要覆盖module.exports,并做类似module.exports.class = ClassC; 然后实例化new ClassC.class(); 但是这也给inheritance和笨拙的代码带来了更多的困难。
  2. 使用TypeScript代替,因为它会处理这个东西。

任何build议,欢迎。

尝试通过类定义将require调用移动到文件末尾。 这是一个工作的例子:

 // a.js class A { foo() { var c = new C(); c.foo(); } } module.exports = A; const C = require('./c.js'); // b.js class B { foo() { var c = new C(); c.foo(); } } module.exports = B; const C = require('./c.js'); // c.js class C { foo() { var a = new A(); a.foo(); } } module.exports = C; const A = require('./a.js'); // main.js const C = require('./c.js'); const B = require('./b.js'); const c = new C(); const b = new B(); c.foo(); b.foo(); 

注意调用c.foo()会导致最大调用堆栈错误。 但是所有的类的引用都按照你的预期来解决。