2009-08-07 16 views
9

Estoy creando una API de JavaScript para SCORM 2004 4th Edition. Para aquellos que no saben sobre SCORM, básicamente es un estándar API que los cursos de eLearning pueden usar para comunicarse con un LMS (Learning Management System). Ahora, la API tiene que tener el siguiente método:Llamada Asynchronous Ajax en SCORM API

  • initialize (args)
  • GetValue (clave)
  • EstablecerValor (clave, valor)
  • Terminate (args)
  • Commit (args)
  • GetDiagnostic (args)
  • GetErrorString (args)
  • GetLastError()

Ahora Initialize debe llamarse antes que cualquier otra cosa, y Terminate debe ser el último. GetValue/SetValue se puede llamar en cualquier lugar entre allí. Lo que estoy haciendo es en el método Initialize. Estoy obteniendo un JSON de un servicio web y lo estoy almacenando en la API (para usarlo luego con los métodos GetValue/SetValue). El problema con el que me estoy cruzando es que la llamada AJAX a través de jQuery es asincrónica, por lo que la llamada al método Initialize podría realizarse antes de que se cargue JSON. Siendo así, una llamada a GetValue después de llamar a Initialize podría causar problemas inesperados, porque el JSON que usa GetValue aún no está allí. Mi pregunta es esta: ¿Qué puedo hacer para asegurarme de que el JSON esté cargado antes de llamar a los métodos GetValue/SetValue? Sé que la respuesta simple es hacerlo sincrónico, pero eso no se aconseja principalmente, y no parece querer hacer eso por mí. Aquí está mi código con respecto a eso:

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 
} 

¿Alguien tiene alguna idea? ¡Yo realmente lo apreciaría!

Respuesta

10

Has articulado bien el problema. Después de que el SCO llame a Initialize, los datos de CMI deben estar disponibles de inmediato para que el SCO haga las siguientes llamadas de GetValue. Sin embargo, no se recomienda realizar llamadas AJAX sincrónicas. Si se produce una interrupción en la solicitud, puede bloquear todo el navegador hasta que la solicitud regrese o agote el tiempo de espera. La solución es precargar todos los datos requeridos antes de que se cargue el SCO. En nuestro SCORM Engine implementation, precargamos todos los datos (CMI y secuenciación) cuando se inicia el reproductor y luego usamos un proceso en segundo plano para enviar periódicamente datos sucios a medida que el alumno progresa a lo largo del curso. Puede ser un poco complicado garantizar que todos los datos se conservan correctamente cuando se trata de combinaciones de posibles escenarios de lanzamiento y salida de ventanas, pero es ciertamente posible. Deberá evitar cualquier solicitud al servidor desde una llamada SCORM API, ya que los SCO a menudo inundan el LMS con grandes lotes de llamadas. Hacer solicitudes de servidor dentro de esas llamadas puede degradar seriamente la experiencia del alumno y colocar una carga de rendimiento en el servidor.

Mike

0

La forma en que abordamos este problema fue poner en cola los datos de CMI en la API cuando se lanza el SCO. Primero navegamos a una página de inicio que carga los datos de CMI en la cola de la API, y luego la página de laucinación realmente lanza el SCO. Cuando el SCO llama a initialize, simplemente movemos los datos al CMI.