2009-08-07 5 views
9

SCORM 2004 4th Edition 용 javascript API를 만들고 있습니다. SCORM에 대해 모르는 사람들을 위해 기본적으로 eLearning 코스가 LMS (Learning Management System)와 통신하는 데 사용할 수있는 API 표준입니다.SCORM API의 비동기식 Ajax 호출

  • 초기화 (인수) (키)
  • SetValue는
  • GetValue (키, 값)
  • 종료 (인수)
  • 커밋 (인수) : 이제 API는 다음과 같은 방법을 가지고있다
  • GetDiagnostic (인수)
  • GetErrorString (인수)
  • GetLastError()
  • ,174,

이제 Initialize가 다른 것보다 먼저 호출되어야하며 Terminate가 마지막에 있어야합니다. GetValue/SetValue는 그 사이의 어디에서나 호출 할 수 있습니다. 내가하고있는 일은 Initialize 메서드에있다. 웹 서비스에서 JSON을 얻고 나중에 GetValue/SetValue 메서드를 사용할 때 API에 저장하려고한다. 내가 건너 오는 문제는 jQuery를 통한 AJAX 호출이 비동기 적이므로 JSON이로드되기 전에 Initialize 메서드 호출을 수행 할 수 있다는 것입니다. 그런 식으로, 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 
} 

누구에게 아이디어가 있습니까? 나는 정말로 그것을 바르게 평가할 것이다!

답변

10

문제를 잘 설명해 주셨습니다. SCO가 Initialize를 호출 한 후에 SCO가 연속 GetValue 호출을 수행 할 수 있도록 CMI 데이터를 즉시 사용할 수 있어야합니다. 그러나 동기식 AJAX 호출을하지 않는 것이 좋습니다. 요청이 중단되면 요청이 반환되거나 시간이 초과 될 때까지 전체 브라우저를 잠글 수 있습니다. 해결책은 SCO가로드되기 전에 필요한 모든 데이터를 미리로드하는 것입니다. SCORM Engine implementation에서는 플레이어가 시작될 때 모든 데이터 (CMI 및 시퀀싱)를 미리로드 한 다음 백그라운드 프로세스를 사용하여 학습자가 코스를 진행하면서 더티 데이터를 주기적으로 커밋합니다. 가능한 모든 창 시작 및 종료 시나리오의 조합을 처리 할 때 모든 데이터가 올바르게 유지되도록 약간 까다로울 수는 있지만 확실히 가능합니다. SCO는 대량 호출로 LMS를 자주 홍수로 치기 때문에 SCORM API 호출 내에서 서버에 대한 요청을 피하기를 원할 것입니다. 이러한 호출 내에서 서버 요청을하면 학습자의 경험을 심각하게 저하시키고 서버에 성능 부담을 초래할 수 있습니다.

마이크

0

우리가이 문제에 접근 한 방법은 SCO가 시작될 때 API에 CMI 데이터를 대기열에 넣는 것이 었습니다. 먼저 CMI 데이터를 API 큐에로드하는 시작 페이지로 이동 한 다음 laucnch 페이지가 실제로 SCO를 실행합니다. SCO가 초기화를 호출하면 데이터를 CMI로 옮깁니다.