Node.js NodeJS ES6:类模块导出

Node.js NodeJS ES6:类模块导出,node.js,class,ecmascript-6,module,Node.js,Class,Ecmascript 6,Module,感谢您阅读我的主题,今天,我有一个关于es6课程的探索,我不知道为什么我运行时会出错。 我有甲级: var B = require("./b"); class A{ constructor() { console.log("Constructor class A"); } helloLoop() { console.log("A: Hello loop"); B.hello(); } helloWitho

感谢您阅读我的主题,今天,我有一个关于es6课程的探索,我不知道为什么我运行时会出错。 我有甲级:

var B = require("./b");
class A{
    constructor() {
        console.log("Constructor class A");
    }

    helloLoop() {
        console.log("A: Hello loop");
        B.hello();
    }

    helloWithoutLoop() {
        console.log("A: Hello without loop");
     }
}

module.exports = new A();
B类:

var A = require("./a");
class B{
    constructor() {
        console.log("Constructor class B");
    }

    hello() {
        console.log("B: Hello");
        A.helloWithoutLoop();
    }
}

module.exports = new B();
还有一个测试:

var A = require("./a");
var B = require("./b");

A.helloLoop();
运行测试时,我收到一个错误:

A.helloWithoutLoop();
TypeError: A.helloWithoutLoop is not a function
at B.hello ({work-sapce}\test\b.js:9:11)
我不想那样! 请帮帮我!
非常感谢

您有一个循环依赖项。您的主文件需要A,而B需要A(循环)。不能那样做。第二次尝试在A本身完成加载之前要求A将返回
null
,这就是为什么会出现奇怪的错误

通常的解决方案是找到通用代码并将其放入第三个模块中,其他模块都可以加载,而不必加载a加载B和B加载a

A加载C和B加载C


或者,更简单的是,只需将A和B放在同一个文件中,这样它们之间就不会循环加载。

这就是您可以调用它们的方式:

import A from './A';
import B from './B';

A.helloLoop();
这是A级:

import B from './B';

class A{
    constructor() {
        console.log("Constructor class A");
    }

    helloLoop() {
        console.log("A: Hello loop");
        B.hello();
    }

    helloWithoutLoop() {
        console.log("A: Hello without loop");
     }
}

export default new A();
这是B类:

import A from './A';

class B{
    constructor() {
        console.log("Constructor class B");
    }

    hello() {
        console.log("B: Hello");
        A.helloWithoutLoop();
    }
}

export default new B();

看到区别了吗

谢谢,我明白了,但当我把A和B放在同一个文件中,比如testAB.js,并删除另一个文件中的所有require时,vi仍然出错。我考虑到这一点,当我再次测试时,我把require A或B(仅)放在类A和B中需要的时候。pumm,这个运行没有错误。多谢各位much@KimEricko-我不知道“vi仍然错误”是什么意思。如果存在运行时Javascript错误,则需要同时包含正在测试的确切代码和确切的错误消息。没有这些信息,我们无法帮助调试。一个没有解释的答案就像一个侦探之谜。你没有解释你改变了什么,为什么改变,任何读者都必须试图弄明白。在a和B之间仍然存在循环依赖关系,这不是一个好的设计,即使你可能已经找到了一个使它工作的方法。你是对的。我会解释我的答案,我只是想给@kim一个解决他/她的问题的方法。我同意u的观点,这两种代码都有循环依赖性。