Json scormapi中的异步Ajax调用

Json scormapi中的异步Ajax调用,json,asynchronous,jquery,scorm,Json,Asynchronous,Jquery,Scorm,我正在为SCORM 2004第4版创建一个javascript API。对于那些不了解SCORM的人来说,它基本上是一种API标准,在线学习课程可以使用它与LMS(学习管理系统)进行通信。现在,API必须具有以下方法: 初始化(args) GetValue(键) 设置值(键、值) 终止(args) 提交(args) GetDiagnostic(args) GetErrorString(args) GetLastError() 现在必须先调用Initialize,然后才调用Terminate。

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

  • 初始化(args)
  • GetValue(键)
  • 设置值(键、值)
  • 终止(args)
  • 提交(args)
  • GetDiagnostic(args)
  • GetErrorString(args)
  • GetLastError()
现在必须先调用Initialize,然后才调用Terminate。GetValue/SetValue可以在两者之间的任意位置调用。我所做的是在Initialize方法中,我从web服务获取一些JSON,并将其存储在API中(稍后使用GetValue/SetValue方法时使用)。我遇到的问题是,通过jQuery的AJAX调用是异步的,因此可以在加载JSON之前完成初始化方法调用。如果是这样的话,在调用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
}

有人有什么想法吗?我会非常感激的

我们解决这个问题的方法是在SCO启动时将CMI数据排入API队列。我们首先导航到一个将CMI数据加载到API队列的启动页面,然后laucnch页面实际启动SCO。当SCO调用initialize时,我们只是将数据移动到CMI中。

您已经很好地阐述了这个问题。SCO调用初始化后,CMI数据需要立即可用,以便SCO进行后续GetValue调用。但是,不建议进行同步AJAX调用,如果请求中出现挂起,它可以锁定整个浏览器,直到请求返回或超时。解决方案是在加载SCO之前预加载所有必需的数据。在我们的示例中,我们在播放器启动时预加载所有数据(CMI和序列),然后在学习者完成课程时使用后台进程定期提交脏数据。在处理可能的窗口启动和退出场景组合时,要确保所有数据正确持久化可能会有点棘手,但这当然是可能的。您将希望避免从SCORM API调用中向服务器发出任何请求,因为SCO通常会大量调用LMS。在这些调用中发出服务器请求会严重降低学习者的体验,并给服务器带来性能负担

迈克