Tworzę javascript API dla SCORM 2004 4th Edition. Dla tych, którzy nie wiedzą o SCORM, zasadniczo jest to standard API, który kursy eLearning mogą wykorzystywać do komunikacji z LMS (Learning Management System). Teraz API musi mieć następującą metodę:Asynchroniczne wywołanie Ajax w SCORM API
- zainicjowana (args)
- getValue (key)
- SetValue (klucz, wartość)
- terminate (args)
- commit (args)
- GetDiagnostic (arg)
- GetErrorString (arg)
- GetlastError()
Teraz Initialize musi być wywołany przed czymkolwiek innym, a Terminate musi być ostatnim. GetValue/SetValue można wywołać w dowolnym miejscu pomiędzy nimi. To, co robię, to metoda Initialize, w której uzyskuję niektóre JSON z usługi sieciowej i przechowuję ją w API (do wykorzystania w późniejszych metodach GetValue/SetValue). Problem, który napotykam, polega na tym, że wywołanie AJAX za pośrednictwem jQuery jest asynchroniczne, więc wywołanie metody Initialize może zostać wykonane przed załadowaniem JSON. W ten sposób wywołanie GetValue po wywołaniu Initialize może spowodować nieoczekiwane problemy b/c JSON, którego używa GetValue, jeszcze nie istnieje. Moje pytanie jest następujące: Co mogę zrobić, aby upewnić się, że JSON jest załadowany przed wywołaniem metod GetValue/SetValue? Wiem, że prostą odpowiedzią jest synchronizacja, ale nie jest to zalecane głównie i wydaje się, że nie chce tego zrobić dla mnie. Oto mój kod na ten temat:
function GetJSON(){
var success = false;
$.ajaxSetup({async:false}); //should make it synchronous
$.getJSON("http://www.mydomain.com/webservices/scorm.asmx/SCORMInitialize?
learnerID=34&jsoncallback=?",
function(data){
bind(data);
success = true;
}
);
return success;
}
function bind(data){
this.cmi = eval("(" + data.d + ")");
$.ajaxSetup({async:true}); //should make it asynchronous again
}
Czy ktoś ma jakieś pomysły? Naprawdę to doceniam!