J'essaie de trouver le motif correct à utiliser pour un singleton qui s'initialise avec un appel AJAX. Ceci est un exemple simplifié de ce que j'ai déjà travaillé. Cela fonctionne comme prévu, mais j'ai l'impression que ce n'est pas la bonne façon et qu'il y a un moyen d'accrocher le callback de l'initialiseur dans l'appel de succès de la requête ajax en cours, et je suis inquiet qu'il y ait pourrait être une condition de concurrence avec l'approche de tableau. Suis-je sur la bonne voie ici?javascriptMVC singleton avec le motif de conception de l'initialiseur AJAX
var singletonObj;
$.Class("SingletonTest", {
init: function(onSuccess) {
if (singletonObj) {
if (singletonObj.ajaxLoaded) {
onSuccess(singletonObj);
}
else {
singletonObj.callbacks.push(onSuccess);
}
}
else {
singletonObj = this;
singletonObj.callbacks = new Array(onSuccess);
singletonObj.count=0;
$.ajax({
url: "/path/to/json/config",
method: "GET",
success: function (res) {
singletonObj.data = res.meta_data;
singletonObj.ajaxLoaded = true
singletonObj.callbacks.forEach(function(callback) {
callback(singletonObj);
});
}
});
}
},
counter: function() {
return this.count++;
}
});
new SingletonTest(function(obj) { console.log("First call: "+obj.counter()) });
new SingletonTest(function(obj) { console.log("Second call: "+obj.counter()) });
new SingletonTest(function(obj) { console.log("Third call: "+obj.counter()) });
Ou y a-t-il une manière plus simple de faire ceci? Quel concept me manque-t-il ici pour rendre la vie plus facile?
pourrait améliorer la pertinence des commentaires! – cliveholloway
En outre, forEach ne fonctionnera pas dans IE et le nouveau tableau() devrait être évité (écrire [onSuccess] à la place). – noah