我正在为SCORM 2004第4版创建一个javascript。对于那些不知道SCORM的人来说,它基本上是一个eLearning课程可以用来与学习管理系统( LMS )通信的API标准。现在,API必须有以下方法:
现在,必须先调用Initialize,最后才必须终止。GetValue/SetValue可以在那里之间的任何地方调用。我所做的是在Initialize方法中,从web服务中获取一些JSON,并将其存储在API中(稍后使用GetValue/SetValue方法时使用)。我遇到的问题是,通过jQuery进行的AJAX调用是异步的,因此可以在加载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
}有人有什么想法吗?我会很感激的!
发布于 2009-08-27 15:51:33
你把问题说得很清楚。上海合作组织调用Initialize后,需要立即提供CMI数据,以便SCO进行后续的GetValue调用。但是,不建议进行同步AJAX调用,如果请求中出现挂起,它可以锁定整个浏览器,直到请求返回或超时为止。解决方案是在上海合作组织加载之前预先加载所有所需的数据.在我们的SCORM引擎的实现中,我们在播放器启动时预加载所有数据(CMI和序列),然后使用后台进程在学习者完成课程时定期提交脏数据。在处理可能的窗口启动和退出场景的组合时,确保所有数据都被正确地持久化可能会变得有点棘手,但这当然是可能的。您将希望避免SCORM调用中对服务器的任何请求,因为SCO通常会大量调用LMS。在这些调用中发出服务器请求会严重降低学习者的体验,并给服务器带来性能负担。
麦克
发布于 2009-08-12 13:21:09
当上海合作组织启动时,我们处理这个问题的方法是在API中排队处理CMI数据。我们首先导航到一个启动页面,该页面将CMI数据加载到API的队列中,然后laucnch页面实际启动SCO。当上海合作组织呼吁非关税化时,我们只需将数据移动到CMI中。
https://stackoverflow.com/questions/1247022
复制相似问题