繁体   English   中英

如何在Node.js中设置交叉同步? (相关通函依赖)

[英]How to set Cross Synchronous in Node.js? (related Circular Dependency)

我有2个彼此依赖的js文件,如下所示:

// slider.js
'use strict';
import Loop from './loop.js';
export default class Slider {
    constructor(elem) {
        this.elem = elem;
        this.Loop = new Loop(this.elem);
        this.Loop.routine();
    }
    updateImage() {
        console.log(
            'Cross Synchronous Test: Updated images',
            'Called the function from loop.js'
        );
    }
}
let proSlider = new Slider('Number')

// loop.js
import Slider from './slider.js';
export default class Loop {
    constructor(elem) {
        this.elem = elem;
        this.Slider = new Slider(this.elem);
        this.Slider.updateImage();
    }
    routine() {
        console.log(
            'Cross Synchronous Test: references a group of actions',
            'Called the function from Slider.js'
        );
    }
}

我的目标是调用函数updateImage()loop.js并调用另一个函数routine()slider.js在实例级别,同一时间。 因此它们可以分为2个不同的文件,但仍可以在需要时互相访问。

问题是这引发了一个错误,称为最大回调堆栈。

未捕获的RangeError:超出最大调用堆栈大小

我已经阅读了一些有关循环依赖#1#2的文章,但文章#2是基于打字稿的。 我更改了代码,没有打字机关键字,然后浏览器触发了相同的错误。

// slider.js
constructor(elem) {
    this.elem = elem;
    this.getLoop();
}
getLoop() {
    return new Loop(this.elem).routine();
}

// loop.js
constructor(elem) {
    this.elem = elem;
    this.getSlider();
}
getSlider() {
    return new Slider(this.elem).updateImage();
}

有什么方法可以在Node.js中设置交叉调用功能?

您的问题不是模块的循环依赖关系,而是非终止的间接递归。

删除代码的所有不必要部分归结为:

class Slider {
    constructor() {
       this.Loop = new Loop();
    }
}

class Loop {
    constructor() {
        this.Slider = new Slider();
    }
}

如您所见, SliderLoop的构造函数在一个永无休止的循环中相互递归调用,该循环永不终止,并创建无数个SliderLoopSliderLoopSliderLoop ,...的交替实例。

解决此难题的一种方法可能是,第二个构造的实例获得一个指向第一个实例的指针并终止递归:

class Slider {
    constructor(elem, loop) {
        this.elem = elem;
        this.Loop = loop || new Loop(this.elem, this);
        this.Loop.routine();
    }
    updateImage() {
        console.log(
            'Cross Synchronous Test: Updated images',
            'Called the function from loop.js'
        );
    }
}

class Loop {
    constructor(elem, slider) {
        this.elem = elem;
        this.Slider = slider || new Slider(this.elem, this);
        this.Slider.updateImage();
    }
    routine() {
        console.log(
            'Cross Synchronous Test: references a group of actions',
            'Called the function from Slider.js'
        );
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM