Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >nodejs循环模块应用程序结构

nodejs循环模块应用程序结构
EN

Stack Overflow用户
提问于 2018-06-09 09:19:59
回答 2查看 129关注 0票数 1

我在以下结构中有3个文件:

  1. root.js
  2. mod1.js
  3. mod2.js

在root.js中,mod1.js和mod2.js都是必需的/实例化的,而mod1.js和mod2.js都需要(“root.js”);所以我可以在root.js中执行对公共函数的回调。我遇到的问题是const = require("root.js");在mod1.js和mod2.js中都是{}或空对象。特别是当我在mod1和mod2中放入更多的代码时,它们最终都是{}

错误屏幕截图可以在这里看到:https://github.com/DarceyLloyd/NodeAppArchitecture/blob/master/issue.png

所以问题是,在实例化过程中,什么结构或什么代码正确地实现了每个类/函数/对象的返回?结构变化?我已经用映射到主体的keyup函数对此进行了测试,这样当我按spac时需要root.js,然后运行它的getA函数就可以了,但是它只在keypress上这样做,所以在类/函数/对象实例化/创建过程中不会这样做。想法?

所有文件都可以在这里看到:https://github.com/DarceyLloyd/NodeAppArchitecture

对于堆栈溢出引用:

root.js

代码语言:javascript
运行
AI代码解释
复制
```javascript

mod1 =需要量(“./mod1.js”);//运行第二次?

mod2 =需要量(“./mod2.js”);//运行1?

函数init(){

代码语言:javascript
运行
AI代码解释
复制
this.a = 0;
代码语言:javascript
运行
AI代码解释
复制
this.b = 0;

}

this.incA =函数(){ this.a++;}

this.incB =函数(){ this.a++;}

this.getA =函数(){返回此.a;console.log(a);}

this.getB =函数(){返回此.b;console.log(b);}

init();

代码语言:javascript
运行
AI代码解释
复制
}

// Cached output so new only ever gets called once module.exports = new Root(); ````

mod1.js

```` var Mod1 = function(){     const root = require("./root.js");
代码语言:javascript
运行
AI代码解释
复制
function init(){
    console.log("Mod1()");
    console.log(root); // result is {}
    //root.incA(); // error incA doesn't exist on object root
}

init();

}

//缓存的输出,因此只有在module.exports =新的Mod1();之后才会调用

mod2.js

代码语言:javascript
运行
AI代码解释
复制
```javascript

函数init(){

代码语言:javascript
运行
AI代码解释
复制
console.log("Mod2()");
代码语言:javascript
运行
AI代码解释
复制
console.log(root); // result is {}
代码语言:javascript
运行
AI代码解释
复制
//root.incB(); // error incB doesn't exist on object root

}

init();

代码语言:javascript
运行
复制

}

//缓存的输出,因此只有在module.exports =新的Mod2();之后才会调用

EN

回答 2

Stack Overflow用户

发布于 2018-06-09 10:09:58

很抱歉让您失望,但是只要您在应用程序中执行循环导入,就不会得到正确的“实例化”。为了达到正确的行为,你不应该以循环的方式导入。目前,您实例化一个对象,而另一个对象尚未实例化。我建议您使用以下解决方案来确保尝试访问的对象被实例化。

代码语言:javascript
运行
AI代码解释
复制
        // ROOT 
        const mod1 = require("./mod1.js"); // Runs 2nd?
        const mod2 = require("./mod2.js"); // Runs 1st?

        var Root = function(){
            this.a = -1;
            this.b = -1;

            this.init = function(){
                this.a = 0;
                this.b = 0;
            }

            this.incA = function() { this.a++; }
            this.incB = function() { this.a++; }
            this.getA = function() { return this.a; console.log(a); }
            this.getB = function() { return this.b; console.log(b); }
        }


        // Cached output so new only ever gets called once
        module.exports = new Root();

        mod2.init()
        mod1.init()


    // MOD2
    var Mod2 = function(){

        this.init = function() {
            const root = require("./root.js");
            console.log("Mod2()");
            root.init()
            console.log(root); // result is {}
            root.incB(); // error incB doesn't exist on object root
        }
    }

    // Cached output so new only ever gets called once
    module.exports = new Mod2;


    // Mod1
    var Mod1 = function(){
        this.init = function() {
            const root = require("./root.js");
            root.init()
            console.log("Mod1()");
            console.log(root); // result is {}
            root.incA(); // error incA doesn't exist on object root
        }
    }

    // Cached output so new only ever gets called once
    module.exports = new Mod1;
票数 0
EN

Stack Overflow用户

发布于 2018-06-09 10:23:24

通常,循环依赖意味着缺乏体系结构,有一个耦合系统,因此,它总是很好地避免循环依赖。如果模块A使用模块B和模块B使用模块A (A -> B,B -> A),那么这可能是同一个模块,甚至还有一个选项试图拆分更小的功能来导入最小的功能。建议的解决方案由@Vitiok‘The,需要模块中的init函数。请记住,需要同步,如果您有一个web应用程序,这可能会冻结您的cpu,如果你击中这个解决方案太多次。

我的建议是:如果您想避免很难调试的问题,请不要创建循环依赖关系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50776765

复制
相关文章
nodejs事件循环
js的执行是事件循环模型,同样作为服务端的nodejs也是基于事件循环的事件模型,但是他又增加了一些非 IO 的异步 API: setTimeOut(), setInterval(), setImmediate() 以及 process.nextTick()。四种方法实现原理相似,但达到的效果略有区别。
OECOM
2020/07/01
1K0
nodejs事件循环
当js同步脚本运行完后,如果有异步操作还没有完成,node就将进入事件循环,像http.createServer.listen,fs.readFileAsync等操作都会使node进入事件循环,没有的话node将直接退出。
conanma
2022/01/04
4710
C语言程序结构3:循环结构
循环结构可以减少代码重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。
用户6755376
2020/03/25
1.1K0
深度理解NodeJS事件循环
ALL THE TIME,我们写的的大部分javascript代码都是在浏览器环境下编译运行的,因此可能我们对浏览器的事件循环机制了解比Node.JS的事件循环更深入一些,但是最近写开始深入NodeJS学习的时候,发现NodeJS的事件循环机制和浏览器端有很大的区别,特此记录来深入的学习了下,以帮助自己及小伙伴们忘记后查阅及理解。
coder2028
2022/10/10
9910
彻底搞懂nodejs事件循环
nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码。当异步事件触发之后,就会通知主线程,主线程执行相应事件的回调。
coder2028
2022/09/26
1.1K0
nodejs之async模块
async模块是为了解决嵌套金字塔,和异步流程控制而生,常用方法有series、parallel、waterfall、parallelLimit、auto、whilst、doWhilst、forever和compose,下面分别对这几种方式进行介绍
OECOM
2020/07/01
9450
NodeJS模块研究 - crypto
这次研究下 nodejs 的 crypto 模块,它提供了各种各样加密算法的 API。这篇文章记录了常用加密算法的种类、特点、用途和代码实现。其中涉及算法较多,应用面较广,每类算法都有自己适用的场景。为了使行文流畅,列出了本文记录的几类常用算法:
心谭博客
2020/04/21
2.3K0
nodejs的path模块
path 模块是 nodejs 中用于处理文件/目录路径的一个内置模块,可以看作是一个工具箱,提供诸多方法供我们使用,当然都是和路径处理有关的。同时在前端开发中 path 模块出现的频率也是比较高的,比如配置 webpack 的时候等。本文是对该模块中一些常用的方法进行介绍,走,一起学习下吧。
coder2028
2022/12/12
9550
Nodejs模块加载流程
直接上图 node require(X).jpg 参考文献:require() 源码解读
娜姐
2021/03/02
1.5K0
Nodejs模块加载流程
NodeJS模块研究 - events
Nodejs 使用了一个事件驱动、非阻塞 IO 的模型。events模块是事件驱动的核心模块。很多内置模块都继承了events.EventEmitter。
心谭博客
2020/04/21
9220
NodeJS模块研究 - cluster
Nodejs 提供了 cluster 来支持服务集群的扩展,提高多核 CPU 的利用效率,实现负载均衡,最大程度利用机器性能。本文从以下几个方面介绍 cluster 的 API 和用法:
心谭博客
2020/04/21
9210
NodeJS模块研究 - zlib
nodejs 的 zlib 模块提供了资源压缩功能。例如在 http 传输过程中常用的 gzip,能大幅度减少网络传输流量,提高速度。本文将从下面几个方面介绍 zlib 模块和相关知识点:
心谭博客
2020/04/21
1.6K0
NodeJS模块研究 - dns
最直观的体验是,当在浏览器中输入网址时,浏览器能够找到网址对应的服务器的 ip 地址。这个过程就是依赖 DNS 域名解析。
心谭博客
2020/04/21
1.5K0
NodeJS模块研究 - process
process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API。从文档出发,管中窥豹,进一步认识和学习 process 模块:
心谭博客
2020/04/21
1.5K0
NodeJS模块研究 - os
nodejs 提供了os.platform()和os.type(),可以用来识别操作系统平台。推荐使用: os.platform()
心谭博客
2020/04/21
7820
Nodejs中OS模块
Node.js os 模块提供了一些基本的系统操作函数。我们可以通过以下方式引入该模块:
ccf19881030
2020/08/22
1.9K0
NodeJS模块研究 - fs
node 的fs文档密密麻麻的 api 非常多,毕竟全面支持对文件系统的操作。文档组织的很好,操作基本分为文件操作、目录操作、文件信息、流这个大方面,编程方式也支持同步、异步和 Promise。
心谭博客
2020/04/21
9550
NodeJS模块研究 - stream
构建复杂程序的时候,通常会将系统拆解成若干功能,这些功能的之间的接口遵循一定的规范,以实现组合连接,共同完成复杂任务。例如管道运算符 | 。
心谭博客
2020/04/21
9550
NodeJs-fs模块
今天一番在家做了一些家务,还出门逛了一圈,街上也不是完全没有人,超市、药店、菜市场人是最多的。现在才有时间来学习和写文章。
efonfighting
2020/02/21
1.5K0
NodeJs-fs模块
nodejs url模块详解
parse方法有两个参数:url字符串与一个可选的布尔值。布尔值用来确定queryString是否要用querystring模块来解析,默认为false。 如果为true,上面的结果如下:
用户2936342
2018/08/27
7680

相似问题

用于复杂应用程序结构的NodeJS本地模块

32

NodeJS应用程序结构-服务

11

Nodejs/Expressjs应用程序结构

30

NodeJS应用程序结构的最佳实践

15

python应用程序结构,动态加载模块

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档