मैं एक नौसिखिया हूं इसलिए शायद मुझे यहां कुछ स्पष्ट याद आ रहा है, लेकिन इसके बारे में कुछ मुझे समझ में नहीं आता है।
मेरे पास एक फ़ंक्शन है जिसे मैं अपने मुख्य कोड से कॉल करना चाहता हूं जो एक चर को संदर्भित करता है जो मुख्य कोड में अक्सर संग्रहीत और परिवर्तित होता है।
मैंने इस उदाहरण कोड में इसे बहुत सरल बना दिया है:

टेस्ट1.जेएस:

const { doStuff } = require("./test2.js");

let x = 1;

setInterval(() => {
    console.log("Test1 :", x);
    x++;
    doStuff();
}, 1000);

module.exports = { x };

टेस्ट2.जेएस:

module.exports = {
    doStuff(){
        let { x } = require("./test1.js");
        console.log("Test2 :", x);
    },
};

तो मैं उम्मीद करता हूं कि जब "doStuff ()" को x की आवश्यकता होती है, तो उसे x का वर्तमान मान मिलेगा, लेकिन लॉग में, मुझे मिलता है:

Test1: 1
Test2: 1
Test1: 2
Test2: 1
Test1: 3
Test2: 1
Test1: 4
Test2: 1

जो दर्शाता है कि test2.js x का मूल मान खींच रहा है।
मैंने पढ़ा है कि इसे कैश्ड मान की आवश्यकता है, इसलिए आपको इसकी आवश्यकता होने से पहले delete require.cache[require.resolve("./test1.js")]; का उपयोग करने की आवश्यकता है, लेकिन जब मैं ऐसा करता हूं, तो मुझे बहुत अजीब व्यवहार मिलता है जहां लॉग की मात्रा प्रत्येक सेकेंड में दोगुनी हो जाती है, और test2। js को अभी भी सही मान नहीं मिलता है।
क्या वैश्विक चर बनाने का मेरा एकमात्र विकल्प है? मैंने सुना है कि वे एक बुरा विचार हैं और मैंने इस तरह से कुछ बहुत बड़ी वस्तुओं की आवश्यकता होने की योजना बनाई थी।

0
soulus 26 अगस्त 2021, 14:47
1
एक राज्य वस्तु निर्यात करें। const state = {x: 1}; और फिर state.x++; और module.exports = { state };
 – 
Tomalak
26 अगस्त 2021, 14:51
इसके लिए धन्यवाद, यह एक आकर्षण की तरह काम करता है
 – 
soulus
26 अगस्त 2021, 14:58
मैं देखता हूं, इसलिए मॉड्यूल की आवश्यकता के कारण शरीर की जड़ में कोड चलने लगता है। बेशक होगा। मैं देखता हूं कि फ़ंक्शन के बारे में आपका क्या मतलब है, लेकिन जब मैं कोशिश करता हूं कि मुझे Warning: Accessing non-existent property 'findx' of module exports inside circular dependency मिलता है, अगर मुझे वह तरीका चाहिए, तो मुझे वेरिएबल और गेटर फ़ंक्शन को एक अलग मॉड्यूल में रखना होगा और दोनों फाइलों में इसकी आवश्यकता होगी, जो आसानी से किया जा सकता है। धन्यवाद
 – 
soulus
26 अगस्त 2021, 15:00
मुख्य बिंदु यह है कि वस्तुएं "संदर्भ द्वारा" हैं और आदिम (जैसे संख्याएं) "मूल्य से" हैं। किसी ऑब्जेक्ट को किसी वैरिएबल पर असाइन करना उसके संदर्भ को कॉपी करता है, इसलिए कई वेरिएबल में एक ही ऑब्जेक्ट हो सकता है, जबकि एक नंबर असाइन करने से वर्तमान मान की एक कॉपी बन जाती है। a = {x: 1}; b = a; a.x++; console.log(b); और a = 1; b = a; a++; console.log(b); की तुलना करें। इसलिए किसी वस्तु का निर्यात करना काम करता है, और एक आदिम का निर्यात नहीं करता है।
 – 
Tomalak
26 अगस्त 2021, 15:14
सामान्य तौर पर, नोड.जेएस परिपत्र निर्भरता का समर्थन नहीं करता है। अपने प्रोजेक्ट्स में सर्कुलर डिपेंडेंसीज न बनाएं। हालाँकि, संदर्भ परिपत्र हो सकते हैं। आपके पास ऐसी वस्तुएं हो सकती हैं जिनमें सदस्य हों जो उस वस्तु को इंगित करने वाली किसी चीज़ की ओर इशारा करते हों। आप इसे require() या import के साथ नहीं कर सकते
 – 
slebetman
26 अगस्त 2021, 15:47

1 उत्तर

सबसे बढ़िया उत्तर

Node.js में मॉड्यूल सिस्टम परिपत्र निर्भरता का समर्थन नहीं करता है और यह डिज़ाइन द्वारा है। आपके मूल मामले में आपने गलती से नोड को एक परिपत्र निर्भरता स्थिति में आलसी रूप से टेस्ट 1 की आवश्यकता के द्वारा धोखा दिया है (फ़ंक्शन को कॉल करने के बाद आपको केवल इसकी आवश्यकता होती है)।

आपको अपना कोड डिज़ाइन करने की आवश्यकता है ताकि निर्भरता केवल एक दिशा में हो। उस चीज़ को पास करें जिसे अन्य मॉड्यूल को निर्भरता के बजाय सामान्य रूप से फ़ंक्शंस का उपयोग करने की आवश्यकता होती है।

टेस्ट1.जेएस:

const { registerX, doStuff } = require("./test2.js");

let x = { value: 1 }; // need something that is not
                      // a number or string since we 
                      // need a reference (pointer)
                      // instead of a value

registerX(x); // we pass x to test2 module

setInterval(() => {
    console.log("Test1 :", x.value);
    x.value++;
    doStuff();
}, 1000);

टेस्ट2.जेएस:

let x = {};

function registerX (otherX) {
    x = otherX;
}

function doStuff(){
    console.log("Test2 :", x.value);
}

module.exports = {
    registerX,
    doStuff
};
0
slebetman 26 अगस्त 2021, 15:56
ध्यान दें कि जावास्क्रिप्ट की बचत अनुग्रह यह है कि प्रकार गतिशील है। हालाँकि यदि आप टाइपस्क्रिप्ट का उपयोग करते हैं तो आप फिर से खुद को परेशानी में पाएंगे क्योंकि TYPES को वस्तुओं की तरह पारित नहीं किया जा सकता है। इसलिए यदि आप टाइपस्क्रिप्ट में सर्कुलर टाइप निर्भरता के साथ समाप्त होते हैं तो आप एक गलती कर रहे हैं। हालांकि एक कामकाज है जो इसे ठीक कर सकता है: इंटरफेस का उपयोग करें और दोनों चीजें एक ही इंटरफेस पर निर्भर हों। या, बहुरूपता का उपयोग करें और एक ही वर्ग या इंटरफ़ेस से दो चीजें प्राप्त करें - एक वर्ग/इंटरफ़ेस स्वयं पर निर्भर हो सकता है
 – 
slebetman
26 अगस्त 2021, 20:45