2009-08-07 154 views
9

我正在爲SCORM 2004第4版創建一個JavaScript API。對於那些不瞭解SCORM的人,基本上它是電子教學課程可以用來與LMS(學習管理系統)進行交流的API標準。現在API必須具有以下的方法:SCORM API中的異步Ajax調用

  • 初始化(參數)
  • 的GetValue(鍵)
  • 的SetValue(鍵,值)
  • 終止(參數)
  • 提交(參數)
  • GetDiagnostic(參數)
  • GetErrorString(參數)
  • GetLastError函數()

現在Initialize必須在其他任何事情之前被調用,並且Terminate必須是最後一個。可以在這之間的任何地方調用GetValue/SetValue。我正在做的是在Initialize方法中,我從Web服務獲取一些JSON並將其存儲在API中(稍後使用GetValue/SetValue方法時使用)。我碰到的問題是,通過jQuery的AJAX調用是異步的,所以Initialize方法調用可以在加載JSON之前完成。通過這種方式,在調用Initialize之後調用GetValue可能會導致意外問題,因爲GetValue使用的JSON尚未出現。我的問題是:我能做些什麼來確保在調用GetValue/SetValue方法之前加載JSON?我知道簡單的答案是使它同步,但這並不是建議大多數,它似乎並不想爲我這樣做。這裏是我的代碼:

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 
} 

有沒有人有任何想法?我真的很感激!

回答

10

你已經很好地闡述了這個問題。在SCO調用Initialize之後,CMI數據需要立即可供SCO進行後續的GetValue調用。但是,建議不要使用同步AJAX調用,如果請求中有掛起,它可以鎖定整個瀏覽器,直到請求返回或超時。解決方案是在加載SCO之前預先加載所有需要的數據。在我們的SCORM Engine implementation中,我們預先載入玩家啓動時的所有數據(CMI和排序),然後使用後臺進程在學習者完成課程時定期提交髒數據。在處理可能的窗口啓動和退出場景的組合時,確保所有數據都能正確保持可能會有點棘手,但這當然是可能的。您將希望避免在SCORM API調用中對服務器的任何請求,因爲SCO經常會用大批量的調用淹沒LMS。在這些調用中發出服務器請求會嚴重降低學習者的體驗並給服務器帶來性能負擔。

Mike

0

我們解決這個問題的方法是在啓動SCO時將CMI數據排入API中。我們首先導航到將CMI數據加載到API隊列的啓動頁面,然後laucnch頁面實際啓動SCO。當SCO調用初始化時,我們只需將數據移入CMI。