Асинхронный вызов Ajax в SCORM API - PullRequest
10 голосов
/ 08 августа 2009

Я создаю API JavaScript для SCORM 2004, 4-е издание. Для тех, кто не знает о SCORM, в основном это стандарт API, который курсы eLearning могут использовать для общения с LMS (система управления обучением). Теперь API должен иметь следующий метод:

  • Initialize (арг)
  • ПолучитьЗначение (ключ)
  • SetValue (ключ, значение)
  • Terminate (арг)
  • Commit (арг)
  • GetDiagnostic (арг)
  • GetErrorString (арг)
  • GetLastError ()

Теперь Initialize должен вызываться раньше всего, а Terminate должен быть последним. GetValue / SetValue можно вызывать где угодно между ними. То, что я делаю, - это метод Initialize. Я получаю некоторый JSON из веб-службы и сохраняю его в API (который будет использоваться при использовании методов GetValue / SetValue позже). Проблема, с которой я сталкиваюсь, состоит в том, что вызов AJAX через jQuery является асинхронным, поэтому вызов метода Initialize может быть выполнен до загрузки JSON. При таком подходе вызов GetValue после вызова Initialize может вызвать непредвиденные проблемы, поскольку JSON, который использует GetValue, еще не создан. У меня такой вопрос: что я могу сделать, чтобы убедиться, что JSON загружен до вызова методов GetValue / SetValue? Я знаю, что простой ответ - сделать это синхронно, но в основном это не рекомендуется, и, похоже, он не хочет делать это для меня. Вот мой код относительно этого:

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 ]

11 голосов
/ 27 августа 2009

Вы хорошо сформулировали проблему. После того, как SCO вызывает Initialize, данные CMI должны быть немедленно доступны для SCO, чтобы сделать последующие вызовы GetValue. Однако делать синхронные вызовы AJAX не рекомендуется, если в запросе происходит зависание, он может заблокировать весь браузер до тех пор, пока запрос не вернется или не истечет время ожидания. Решение состоит в том, чтобы предварительно загрузить все необходимые данные перед загрузкой SCO. В нашей реализации SCORM Engine мы предварительно загружаем все данные (CMI и последовательность) при запуске проигрывателя, а затем используем фоновый процесс для периодической фиксации грязных данных по мере прохождения студентом курса. Может быть немного сложно обеспечить правильное сохранение всех данных при работе с комбинациями возможных сценариев запуска и выхода из окна, но это, безусловно, возможно. Вам следует избегать любых запросов к серверу из вызова API SCORM, так как SCO часто будут заполнять LMS большими пакетами вызовов. Выполнение запросов к серверу в рамках этих вызовов может серьезно ухудшить опыт учащегося и снизить нагрузку на сервер.

Mike

0 голосов
/ 12 августа 2009

Способ, которым мы подошли к этой проблеме, состоял в том, чтобы поставить в очередь данные CMI в API при запуске SCO. Сначала мы переходим на страницу запуска, которая загружает данные CMI в очередь API, а затем страница laucnch фактически запускает SCO. Когда SCO вызывает intialize, мы просто перемещаем данные в CMI.

...