2009-08-07 53 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。