Non. Lorsque la mise en cache des modules de Node échoue, ce modèle de singleton échoue. J'ai modifié l'exemple pour qu'il fonctionne correctement sous 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());
Cela donne le résultat que l'auteur avait prévu :
{ '1': 'test', '2': 'test2' } { '1': 'test', '2': 'test2' }
Mais une petite modification fait échouer la mise en cache. Sous OSX, faites ceci :
var sg = require("./singleton.js");
var sg2 = require("./SINGLETON.js");
sg.add(1, "test");
sg2.add(2, "test2");
console.log(sg.getSocketList(), sg2.getSocketList());
Ou, sur Linux :
% ln singleton.js singleton2.js
Ensuite, changez le sg2
exiger la ligne à :
var sg2 = require("./singleton2.js");
Et bam le singleton est vaincu :
{ '1': 'test' } { '2': 'test2' }
Je ne connais pas de moyen acceptable de contourner ce problème. Si vous ressentez vraiment le besoin de faire quelque chose qui ressemble à un singleton et que vous êtes d'accord pour polluer l'espace de noms global (et les nombreux problèmes qui peuvent en résulter), vous pouvez changer le nom de l'auteur en getInstance()
y exports
des lignes vers :
singleton.getInstance = function(){
if(global.singleton_instance === undefined)
global.singleton_instance = new singleton();
return global.singleton_instance;
}
module.exports = singleton.getInstance();
Cela dit, je n'ai jamais rencontré de situation sur un système de production où j'ai eu besoin de faire quelque chose comme ça. Je n'ai également jamais ressenti le besoin d'utiliser le modèle singleton en Javascript.