11

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

  • 初始化(参数)
  • 获取值(键)
  • 设置值(键,值)
  • 终止(参数)
  • 提交(参数)
  • 获取诊断(参数)
  • 获取错误字符串(参数)
  • 获取上一个错误()

现在 Initialize 必须在其他任何事情之前调用,并且 Terminate 必须在最后。GetValue/SetValue 可以在两者之间的任何地方调用。我正在做的是在 Initialize 方法中,我从 Web 服务获取一些 JSON 并将其存储在 API 中(稍后在使用 GetValue/SetValue 方法时使用)。我遇到的问题是通过 jQuery 的 AJAX 调用是异步的,因此可以在加载 JSON 之前完成 Initialize 方法调用。既然这样,在调用 Initialize 之后调用 GetValue 可能会导致意外问题,因为 GetValue 使用的 JSON 尚不存在。我的问题是:如何确保在调用 GetValue/SetValue 方法之前加载 JSON?我知道简单的答案是让它同步,但大多数情况下不建议这样做,而且它没有 t 似乎想为我做那件事。这是我的代码:

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
}

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

4

2 回答 2

10

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

麦克风

于 2009-08-27T15:51:33.560 回答
0

The way we approached this problem was to queue the CMI data in the API when the SCO is launched. We first navigate to a launch page that loads the CMI data into the API's queue, and then the laucnch page actually launches the SCO. When the SCO calls intialize, we just move the data into the CMI.

于 2009-08-12T13:21:09.780 回答