Я пытаюсь выработать правильный шаблон для использования Singleton, который инициализируется вызовом AJAX. Это упрощенный пример того, что я уже работаю.javascriptMVC singleton с шаблоном проектирования инициализатора AJAX
Работает так, как ожидалось, но я чувствую, что это не «правильный» способ, и есть способ связать обратный вызов инициализатора с вызовом успешного выполнения текущего выполняемого запроса 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()) });
Или есть более простой способ сделать это? Какую концепцию мне не хватает, что облегчит жизнь?
может стоять, чтобы улучшить комментарий! – cliveholloway
Кроме того, forEach не будет работать в IE, а новый Array() следует избегать (вместо этого писать [onSuccess]). – noah