当我直接从File2.js运行时,我尝试使用文件2中文件1中的函数,但是当我尝试从File1运行时,我得到了: UnhandledPromiseRejectionWarning:TypeError:func1不是函数
文件1:
const { func3 } = require("./File2.js")
function func1();
function func2();
func3(); //ok!
module.exports = {
func1,
func2
};
文件2:
const { func1, func2 } = require("./File1.js")
function func3() {
func1() //error
func2() //error
}
module.exports = {
func3,
};
当我调用节点文件2时,我可以正常调用func 1,func2正常工作;
但是当我运行文件1并调用file2()时,我对文件1中的func1和func2没有定义
UnhandledPromiseRejectionWarning:TypeError:func1不是函数
有人知道如何解决吗?我尝试过更改要求,也删除了避免重复,但仍然没有找到解决方法
答案 0 :(得分:2)
这是最佳实践,严格避免代码中循环依赖的主要原因。他们几乎从来都不是一个好主意,通过其他方式可以使您所寻求的行为变得更加清晰。
要了解该问题,您应该知道,require
文件时,在执行新文件时会暂停当前文件的执行。这意味着当口译员点击此行时:
const { func3 } = require("./File2.js")
它暂停 File1.js(在分配其module.exports
之前!),并立即开始执行File2.js。现在,File2.js的第一行是执行File1.js的指令,我们刚刚从它开始。解释器识别File1已经在执行中,因此它只返回module.exports
的当前值-一个空对象。因此,其属性func1
和func2
在当时是未定义的,并且永远不会重新分配。
循环依赖几乎总是不必要的。如果遇到您认为可以通过循环依赖解决的情况,则应重新考虑思路,使关系严格为单向。
简而言之:File2需要File1中的func1
和func2
。这并不意味着File2取决于File1。您可以简单地将这两个函数作为参数传递给从File2导出的函数,并且对循环依赖关系的需求也就消失了。
这里是一个示例:
文件1:
function func1();
function func2();
const { func3 } = require("./File2.js")(func1, func2);
func3(); //ok!
文件2:
module.exports = function(func1, func2) {
return {
func3: function() {
func1() //ok!
func2() //ok!
}
}
};