मैं एक नौसिखिया हूं इसलिए शायद मुझे यहां कुछ स्पष्ट याद आ रहा है, लेकिन इसके बारे में कुछ मुझे समझ में नहीं आता है।
मेरे पास एक फ़ंक्शन है जिसे मैं अपने मुख्य कोड से कॉल करना चाहता हूं जो एक चर को संदर्भित करता है जो मुख्य कोड में अक्सर संग्रहीत और परिवर्तित होता है।
मैंने इस उदाहरण कोड में इसे बहुत सरल बना दिया है:
टेस्ट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 को अभी भी सही मान नहीं मिलता है।
क्या वैश्विक चर बनाने का मेरा एकमात्र विकल्प है? मैंने सुना है कि वे एक बुरा विचार हैं और मैंने इस तरह से कुछ बहुत बड़ी वस्तुओं की आवश्यकता होने की योजना बनाई थी।
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
};
const state = {x: 1};
और फिरstate.x++;
औरmodule.exports = { state };
।Warning: Accessing non-existent property 'findx' of module exports inside circular dependency
मिलता है, अगर मुझे वह तरीका चाहिए, तो मुझे वेरिएबल और गेटर फ़ंक्शन को एक अलग मॉड्यूल में रखना होगा और दोनों फाइलों में इसकी आवश्यकता होगी, जो आसानी से किया जा सकता है। धन्यवादa = {x: 1}; b = a; a.x++; console.log(b);
औरa = 1; b = a; a++; console.log(b);
की तुलना करें। इसलिए किसी वस्तु का निर्यात करना काम करता है, और एक आदिम का निर्यात नहीं करता है।require()
याimport
के साथ नहीं कर सकते