Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从不同的文件节点js导入_Javascript_Node.js - Fatal编程技术网

Javascript 从不同的文件节点js导入

Javascript 从不同的文件节点js导入,javascript,node.js,Javascript,Node.js,我试图在文件2中使用文件1中的函数,当我直接从File2.js运行时效果很好,但当我尝试从File1运行时,我得到: 未处理的PromisejectionWarning:TypeError:func1不是函数 文件1: const { func3 } = require("./File2.js") function func1(); function func2(); func3(); //ok! module.exports = { func1, func2 }; fu

我试图在文件2中使用文件1中的函数,当我直接从File2.js运行时效果很好,但当我尝试从File1运行时,我得到: 未处理的PromisejectionWarning:TypeError:func1不是函数

文件1:

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

function func1();
function func2();

func3(); //ok!

module.exports = {
    func1,
    func2
};
function func1();
function func2();

const { func3 } = require("./File2.js")(func1, func2);

func3(); //ok!
文件2:

const { func1, func2 } = require("./File1.js")

function func3() {
  func1() //error
  func2() //error
}
module.exports = {
    func3,
};
module.exports = function(func1, func2) {
  return {
    func3: function() {
      func1() //ok!
      func2() //ok!
    }
  }
};
当我调用节点文件2时,我可以调用func 1,func 2没有问题,运行良好

但当我运行文件1并调用file2()时,我在文件1中未定义func1和func2

未处理的PromisejectionWarning:TypeError:func1不是函数

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

避免循环依赖 这就是在代码中严格避免循环依赖是最佳实践的主要原因。它们几乎从来都不是一个好主意,你所追求的行为可以通过其他方式实现

要理解这个问题,您应该知道,当您
需要一个文件时,当前文件的执行会在新文件执行时暂停。这意味着当解释器点击这一行时:

const { func3 } = require("./File2.js")
它暂停File1.js(在分配其
模块.exports
之前!),并立即开始执行File2.js。现在,File2.js的第一行是一个执行File1.js的指令,我们刚刚从中得到这个指令。解释器识别出File1已经在执行中,因此它只返回
模块的当前值。因此,它的属性
func1
func2
在当时是未定义的,它们永远不会被重新分配

导出包装器函数 循环依赖几乎总是不必要的。如果你遇到一个你认为可以通过循环依赖来解决的情况,你应该重新思考,让这种关系完全单向

简而言之:您的文件2需要来自文件1的
func1
func2
。这并不意味着File2依赖于File1。您只需将这两个函数作为参数传递给从File2导出的函数,循环依赖关系的需求就消失了

以下是一个示例:

文件1:

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

function func1();
function func2();

func3(); //ok!

module.exports = {
    func1,
    func2
};
function func1();
function func2();

const { func3 } = require("./File2.js")(func1, func2);

func3(); //ok!
文件2:

const { func1, func2 } = require("./File1.js")

function func3() {
  func1() //error
  func2() //error
}
module.exports = {
    func3,
};
module.exports = function(func1, func2) {
  return {
    func3: function() {
      func1() //ok!
      func2() //ok!
    }
  }
};