从不同文件导入节点js

时间:2020-06-01 16:04:19

标签: javascript node.js

当我直接从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不是函数

有人知道如何解决吗?我尝试过更改要求,也删除了避免重复,但仍然没有找到解决方法

1 个答案:

答案 0 :(得分:2)

避免循环依赖

这是最佳实践,严格避免代码中循环依赖的主要原因。他们几乎从来都不是一个好主意,通过其他方式可以使您所寻求的行为变得更加清晰。

要了解该问题,您应该知道,require文件时,在执行新文件时会暂停当前文件的执行。这意味着当口译员点击此行时:

const { func3 } = require("./File2.js")

暂停 File1.js(在分配其module.exports之前!),并立即开始执行File2.js。现在,File2.js的第一行是执行File1.js的指令,我们刚刚从它开始。解释器识别File1已经在执行中,因此它只返回module.exports当前值-一个空对象。因此,其属性func1func2在当时是未定义的,并且永远不会重新分配。

导出包装器功能

循环依赖几乎总是不必要的。如果遇到您认为可以通过循环依赖解决的情况,则应重新考虑思路,使关系严格为单向。

简而言之:File2需要File1中的func1func2。这并不意味着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!
    }
  }
};