簡體   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