Nodejs的循环调用的问题
发布日期:2021-11-15 14:57:45 浏览次数:31 分类:技术文章

本文共 1527 字,大约阅读时间需要 5 分钟。

写代码的时候出现过下面的例子,两个文件中的函数互相调用,导致其中一个函数调用出现问题。

简化下来就是以下三个文件a.js、b.js、c.js。
a.js

const b = require('./b');function a(num) {
console.log(`a`); if(num != 1){
b.b(); }}module.exports = {
a};

b.js

const a = require('./a');function b(num) {
console.log(`b`); a.a(1);}module.exports = {
b};

c.js

const a = require('./a');a.a(0);

当执行c文件的时候,就会在b文件中报以下错误:

abTypeError: a.a is not a function

原因是在a文件中加载b的时候,a还没有全部加载完,导致b文件中加载a的时候,b获取的是a未完全加载的内容,从而导致在b文件中执行a.a(1);时会报错,因为此时a文件中的a函数尚未加载。

可以添加点返回值,查看加载情况:
a.js

console.log(1)this.n = 1;const b = require('./b');this.m = 1;this.n = 2;console.log(2)function a(num) {
console.log(`a`); if(num != 1){
b.b(); }}module.exports = {
a};

b.js

console.log(3)const a = require('./a');console.dir(a);console.log(4)function b(num) {
console.log(`b`); a.a(1);}module.exports = {
b};

c.js

const a = require('./a');a.a(0);

当执行c文件时:

13{
n: 1 }42ab/b.js:9 a.a(1); ^TypeError: a.a is not a function

可以发现在加载b文件的时候,a文件只加载了

a.js

console.log(1)this.n = 1;const b = require('./b');

,并没有全部加载,同时在b文件中加载a文件的时候,就自动获取了残缺的a,而不会去重新获取全部的a文件,这也防止其加载不会重复加载而导致进入死循环。

通过this方式有解决方法:

a.js

const b = require('./b');function a(num) {
console.log(`a`); if(num != 1){
b.b.apply(this);//<---- }}module.exports = {
a};

b.js

function b(num) {
console.log(`b`); this.a(1);//<----}module.exports = {
b};

c.js

const a = require('./a');a.a(0);

直接将a通过this方式传递给b,在b中就可以直接通过this进行访问a中的函数了。

转载地址:https://blog.csdn.net/qq_39741836/article/details/109581742 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mongodb数据备份与恢复基本操作示例
下一篇:源码包下载地址(更新中)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月24日 13时57分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

摩托罗拉v3java_拆一代超薄经典手机-摩托罗拉V3 2019-04-21
java调用asp.net webapi_ASP.NET Web API编程——客户端调用 2019-04-21
k近邻算法python解读_机器学习(K-近邻算法)Python的基础知识 2019-04-21
java timer并发_Java并发编程笔记之Timer源码分析 2019-04-21
java项目事故_记录 Linux环境下java web项目CPU爆表 “事故”,肇事者:GC 2019-04-21
mysql 存储过程 select insert_存储过程执行select与insert同一个表sql语句 2019-04-21
java声明变量保存性别_java第二次课变量第一次上机 2019-04-21
js装修计算器java代码_JavaScript代码实现简单计算器 2019-04-21
功夫传人java_PAT L2-020 功夫传人【BFS】 2019-04-21
联机侠控制台JAVA_联机侠控制台常见问题 | 我的世界 | MC世界侠 2019-04-21
2018转行的java学习_2018java平均工资,想转行学java的快点上车 2019-04-21
glade java_如何在Java Gnome / GTK程序中使用Glade UI(.glade文件)? 2019-04-21
java 常用数据库_java连接常用数据库 2019-04-21
sublime php运行环境_【转载】Sublime Text 3设置吊炸天PHP开发环境 2019-04-21
有什么可以替换php,php替换函数是什么 2019-04-21
java静态方法是不是成员方法,Java静态变量与静态方法与成员变量成员方法的区别... 2019-04-21
oracle 结构讲解,Oracle 数据库体系结构解析 2019-04-21
merger oracle,merger oracle 函数 2019-04-21
oracle自带的sql环境,转载:使用Oracle11g自带的SQL Developer报错:Unable to find a Java Virtual Machine... 2019-04-21
oracle shrink space compact,oracle 学习笔记 Shrink 参数 compact 2019-04-21