2009-08-07 7 views
9

私はSCORM 2004 4th Edition用のjavascript APIを作成しています。 SCORMについて知らない人にとっては、基本的に、eラーニングコースがLMS(Learning Management System)と通信するために使用できるAPI標準です。SCORM APIの非同期Ajax呼び出し

  • 初期化(引数)(キー)
  • のSetValue
  • GetValueメソッド(キー、値)
  • 終了(引数)
  • コミット(引数):今、APIには、以下の方法を有することがあります
  • GetDiagnostic(引数)
  • は、getErrorString(引数)
  • のGetLastError()

ここでInitializeを呼び出す前に、Terminateを最後に呼び出す必要があります。 GetValue/SetValueは、その間のどこでも呼び出すことができます。私がやっているのは、Initializeメソッドです。WebサービスからJSONを取得し、APIに保存しています(GetValue/SetValueメソッドを使用するときに使用します)。私が遭遇する問題は、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がintializeを呼び出すと、データをCMIに移動するだけです。

関連する問題