代码之家  ›  专栏  ›  技术社区  ›  Dan Appleyard

SCORM API中的异步Ajax调用

  •  9
  • Dan Appleyard  · 技术社区  · 15 年前

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

    • 初始化(参数)
    • 获取值(键)
    • 设置值(键,值)
    • 终止(ARGS)
    • 提交(ARGS)
    • 获取诊断(参数)
    • GetErrorString(参数)
    • GETLASTROR()

    现在必须先调用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
    }
    

    有人有什么想法吗?我真的很感激!

    2 回复  |  直到 15 年前
        1
  •  11
  •   Mike Rustici    15 年前

    你已经把问题讲得很清楚了。在sco调用初始化之后,CMI数据需要立即可供sco进行后续的getValue调用。但是,不建议进行同步Ajax调用,如果请求中有挂断,它可以锁定整个浏览器,直到请求返回或超时。解决方案是在加载SCO之前预加载所有必需的数据。在我们 SCORM Engine implementation 当启动播放器时,我们预加载所有数据(CMI和序列),然后使用后台进程定期提交脏数据,以便学习者在课程中继续学习。在处理可能的窗口启动和退出方案组合时,要确保所有数据都正确地持久化可能会有点困难,但这当然是可能的。您将希望避免从一个scorm api调用中向服务器发出任何请求,因为scos通常会用大量调用淹没lms。在这些调用中发出服务器请求会严重降低学习者的体验并给服务器带来性能负担。

    迈克

        2
  •  0
  •   Ishmael    15 年前

    我们处理这个问题的方法是在启动SCO时在API中对CMI数据进行排队。我们首先导航到一个将CMI数据加载到API队列中的启动页面,然后LAUCNCH页面实际启动了SCO。当sco调用intialize时,我们只是将数据移动到CMI中。