ไม่ เมื่อการแคชโมดูลของโหนดล้มเหลวรูปแบบซิงเกิลตันนั้นจะล้มเหลว ฉันแก้ไขตัวอย่างเพื่อให้ทำงานอย่างมีความหมายบน OSX:
var sg = require("./singleton.js");
var sg2 = require("./singleton.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
สิ่งนี้ให้ผลลัพธ์ที่ผู้เขียนคาดการณ์ไว้:
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
แต่การปรับเปลี่ยนเล็กน้อยเอาชนะการแคช บน OSX ให้ดำเนินการดังนี้:
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
หรือบน Linux:
% ln singleton.js singleton2.js
จากนั้นเปลี่ยนsg2
บรรทัดที่ต้องการเป็น:
var sg2 = require("./singleton2.js");
และแบมซิงเกิลตันพ่ายแพ้:
{ '1': 'test' } { '2': 'test2' }
ฉันไม่รู้วิธีที่ยอมรับได้ในการแก้ไขปัญหานี้ หากคุณรู้สึกว่าจำเป็นต้องสร้างสิ่งที่เหมือนซิงเกิลตันจริง ๆ และไม่เป็นไรกับการทำให้เนมสเปซทั่วโลกเป็นมลพิษ (และปัญหามากมายที่อาจเกิดขึ้น) คุณสามารถเปลี่ยนผู้แต่งgetInstance()
และexports
บรรทัดเป็น:
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
ที่กล่าวว่าฉันไม่เคยเจอสถานการณ์ในระบบการผลิตที่ฉันต้องทำอะไรแบบนี้ ฉันไม่เคยรู้สึกว่าจำเป็นต้องใช้รูปแบบซิงเกิลตันใน Javascript