2009-08-07 16 views
9

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!

Odpowiedz

10

Dobrze wymyśliłeś ten problem. Po wywołaniu wywołań SCO, dane CMI muszą być natychmiast dostępne dla SCO, aby móc wykonywać kolejne wywołania GetValue. Jednak wykonywanie synchronicznych wywołań AJAX nie jest zalecane, jeśli w żądaniu jest zawieszenie, może zablokować całą przeglądarkę, dopóki żądanie nie powróci lub upłynie limit czasu. Rozwiązaniem jest wstępne załadowanie wszystkich wymaganych danych przed załadowaniem SCO. W naszym SCORM Engine implementation, wstępnie ładujemy wszystkie dane (CMI i sekwencjonowanie) po uruchomieniu odtwarzacza, a następnie wykorzystujemy proces w tle do okresowego zatwierdzania brudnych danych, podczas gdy uczeń postępuje w trakcie kursu. Może to trochę skomplikować, aby upewnić się, że wszystkie dane są prawidłowo przechowywane w przypadku kombinacji możliwych scenariuszy uruchamiania i zamykania okien, ale jest to z pewnością możliwe. Będziesz chciał uniknąć jakichkolwiek żądań do serwera z poziomu wywołania interfejsu API SCORM, ponieważ SCO często zaleją LMS dużymi partiami wywołań. Zgłaszanie żądań serwera w ramach tych połączeń może poważnie pogorszyć doświadczenie ucznia i spowodować obciążenie wydajnościowe na serwerze.

Mike

0

Sposób, w jaki podeszliśmy do tego problemu, polegał na kolejkowaniu danych CMI w interfejsie API po uruchomieniu SCO. Najpierw przechodzimy do strony startowej, która ładuje dane CMI do kolejki API, a następnie strona Laucnch uruchamia SCO. Kiedy wywołania SCO inicjują, po prostu przenosimy dane do CMI.