SCORM API中的异步Ajax调用

Dan*_*ard 10 jquery json asynchronous scorm

我正在为SCORM 2004第4版创建一个javascript API.对于那些不了解SCORM的人来说,基本上它是一个API标准,电子教学课程可以用来与LMS(学习管理系统)进行通信.现在API必须具有以下方法:

  • 初始化(参数)
  • 的GetValue(钥匙)
  • SetValue(键,值)
  • 终止(参数)
  • 提交(参数)
  • GetDiagnostic(参数)
  • GetErrorString(参数)
  • GetLastError函数()

现在必须在其他任何东西之前调用Initialize,而Terminate必须在最后一个之前调用.可以在那里之间的任何地方调用GetValue/SetValue.我正在做的是在Initialize方法中我从Web服务获取一些JSON并将其存储在API中(稍后使用GetValue/SetValue方法时使用).我遇到的问题是通过jQuery的AJAX调用是异步的,因此可以在加载JSON之前完成Initialize方法调用.这就是它的方式,在调用Initialize之后调用GetValue可能会导致意外问题b/c 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
}
Run Code Online (Sandbox Code Playgroud)

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

小智 11

你很清楚地表达了这个问题.在SCO调用Initialize之后,需要立即为SCO提供CMI数据以进行后续的GetValue调用.但是,不建议进行同步AJAX调用,如果请求中有挂起,它可以锁定整个浏览器,直到请求返回或超时.解决方案是在加载SCO之前预加载所有必需的数据.在我们的SCORM Engine实现中,我们在启动播放器时预加载所有数据(CMI和排序),然后使用后台进程在学习者进入课程时定期提交脏数据.在处理可能的窗口启动和退出场景的组合时,确保所有数据都被正确保留可能会有点棘手,但这当然是可能的.您将希望避免在SCORM API调用中向服务器发出任何请求,因为SCO通常会通过大批量调用来充斥LMS.在这些调用中发出服务器请求会严重降低学习者的体验并给服务器带来性能负担.

麦克风