Machen Funktionen warten, bis AJAX-Aufruf mit jQuery
Ich versuche zu entwickeln, die eine Klasse in JavaScript, die ich verwenden kann, um Zugang zu einem laden der erfassten Daten mit einem AJAX-request einfach. Das problem ist nur, ich brauche, um die Mitglieder der Klasse zugänglich nur einmal der AJAX-Aufruf abgeschlossen ist. Idealerweise das, was ich möchte, um am Ende, ist etwas, wo ich anrufen kann dies in einem Skript:
courses.getCourse('xyz').complete = function () {
//do something with the code
}
Und dies wird nur ausgelöst, nachdem der AJAX-Aufruf wurde abgeschlossen, und die Daten-Strukturen in der "Klasse" bereit sind, verwendet werden. Im Idealfall möchte ich nicht erstellen müssen .komplett-Mitglied für jede Funktion in der Klasse
Hier ist die "Klasse" ich versuche, so weit:
var model_courses = (function() {
var cls = function () {
var _storage = {}; //Used for storing course related info
_storage.courses = {}; //Used for accessing courses directly
_storage.references = new Array(); //Stores all available course IDs
var _ready = 0;
$.ajax({
type: "GET",
url: "data/courses.xml",
dataType: "xml",
success: function(xml) {
$(xml).find("course").each(function() {
_storage.courses[$(this).attr('id')] = {
title : $(this).find('title').text(),
description : $(this).find('description').text(),
points : $(this).find('points').text()
}
_storage.references.push($(this).attr('id'))
})
}
})
console.log(_storage.courses)
}
cls.prototype = {
getCourse: function (courseID) {
console.log(cls._storage)
},
getCourses: function () {
return _storage.courses
},
getReferences: function (),
return _storage.references
}
}
return cls
})()
Im moment getCourse wird ausgelöst, bevor der AJAX-request abgeschlossen ist und es offensichtlich keine Daten für den Zugang.
Alle Ideen werden sehr geschätzt, im stecken auf dieser!
- Ruft
courses.getCourse('xyz', function (course) {...})
nicht akzeptabel? Das ist die standard-Methode zum Umgang mit asynchronen Operationen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende änderungen können Sie machen, der AJAX-request nur einmal und rufen Sie Ihre Funktion wie
Hier sind die änderungen
Als eine Randnotiz, dass Ihr Modul Muster wird nicht sehr gut funktionieren, wenn Sie brauchen, um zu instanziieren zwei dieser
model_courses
Objekte, da die storage-Objekte werden alle gemeinsam in Ihrem selbst aufrufende Funktion die Schließung. Sie in der Regel nicht mischen, das Modul-Muster mit Prototypen (gibt einen Konstruktor aus einem Modul), es sei denn, Sie wirklich wissen, was Sie tun, ist, dass die shared closure-Variablen arbeiten, die als statische Eigenschaften Ihrer Klasse.Dies ist, was ich tun würde, wenn ich du wäre (da Sie wirklich wollen, private Variablen)
jQuery bereits erledigt dies für Sie die Verwendung der zurückgestellten Objekte, es sei denn, ich bin Missverständnis, was Sie suchen.
Ich weiß, das ist nicht genau das, was du suchst, ich hoffe, es ist genug, um schieben Sie Sie in die richtige Richtung. Latente Objekte sind genial.
in
getStorage
entweder einen check, um zu sehen, ob es irgendwelche Daten zu stehlen (bevorzugt), oder das "eigentliche" Methode als private zu veröffentlichen ist, wenn es hat Elemente, die es zugreifen kann. (Ich würde empfehlen, die erste aber sonst bekommen Sie die Ausnahmen über eine Methode aufrufen, die nicht existiert, auf ein Objekt).Können Sie eine Funktion definieren, die
getData
Ausführung der ajax-Anfrage und das würde diegetCourse
als callback.Die
getData
könnte möglicherweise speichern, lokal das Ergebnis des Ajax-Aufrufs, und testen Sie den lokalen Speicher, der vor dem durchführen der ajax-Aufruf.Könnte man auch angeben, ein eigenes Mitglied zu erlauben, der ajax-Aufruf nur einmal ausgeführt.
Möchten Sie vielleicht zu prüfen, underscore.js für einige handliches Werkzeug
Hier ist ein kurzer Beispiel code :