Pregunta

Yo entiendo que no hay soporte multihilo en javascript. Y quería algún consejo experto en el escenario a continuación ..

Mi requisito es realizar una llamada AJAX y sobre completetion éxito, i quiere activar un conjunto de eventos (para actualizar las diferentes partes de la interfaz de usuario en paralelo)

  • Soy previsto utilizar Subscribe / patrón Publicar, es posible suscribirse múltiples listners al evento finalización AJAX.
  • Si es posible, yo quería saber cómo estos listners notificados en publicar .. (paralelamente en forma muthithreaded o de uno en uno).

    Y me sugieren la mejor manera de achive este .. Realmente aprecio sus pensamientos.

EDITAR ::

Sé que hay marcos populares como jQuery es compatible con este patrón. Pero estoy en una situación de desarrollar esta funcionalidad desde un cero (tenemos nuestro propio marco).

¿Fue útil?

Solución

Tengo un Pooler Solicitar que se le podría dar una buena ventaja inicial aquí. [Dado que esta respuesta fue aceptada me he retirado del pooler a favor de una más completa "AJAX ayudante" -. El enlace ha sido actualizado]

No estoy seguro de que va a hacer todo lo que quiere (aunque suena como que puede estar cerca). Es antiguo, pero funciona:

deprimido Prensa DP_AJAX

Es compatible con múltiples solicitudes simultáneas con los manipuladores de tiempo de espera / reintento, por solicitud, tiene una huella muy pequeña y puede ser combinado con otro código fácilmente.

Se crea una piscina (que le diga cuántas se permiten peticiones simultáneas) y luego tirar peticiones en ella. Cuando terminen lo que ellos llaman controlador especificado.

Un pequeño ejemplo, completa de su uso:

        // The handler function
function AddUp(Num1, Num2, Num3) {
    alert(Num1 + Num2 + Num3);
};

    // Instantiate the Pool
myRequestPool = new DP_RequestPool(4);

    // Start the Interval
myRequestPool.startInterval(100);

    // Create the Request
myRequest = new DP_Request(
    "GET",
    "http://www.mysite.com/Add.htm",
    {"FirstNum" : 5, "SecondNum" : 10},
    AddUp,
    [7,13]);

    // Add the request to the queue
myRequestPool.addRequest(myRequest);

Es de código abierto - no dude en para picar / fold / cabezal o mutilar a su contenido de los corazones

.

Jim Davis

Otros consejos

En este artículo se describe lo que estamos tratando de lograr bastante cercanamente. Esencialmente sólo hay un archivo JavaScript que contiene una matriz de manipuladores / abonados. Cada abonado registra a sí mismo con el editor (es decir, se añade a la matriz de manipuladores). A continuación, en el controlador onClose de su llamada Ajax, que se podría llamar una función que itera sobre los suscriptores y les notifica a cada uno por su nombre:

this.handlers = [];
...
 for(var i = 0; i < this.handlers.length; i++)
  {
    this.handlers[i].eventHandler.call(this, eventArgs);
 }
...

Podría esto servirá como marco el paso de mensajes ligthweight?

function MyConstructor() {
    this.MessageQueues = {};

    this.PostMessage = function (Subject) {
        var Queue = this.MessageQueues[Subject];
        if (Queue) return function() {
                                        var i = Queue.length - 1;
                                        do Queue[i]();
                                        while (i--);
                                    }
        }

    this.Listen = function (Subject, Listener) {
        var Queue = this.MessageQueues[Subject] || [];
        (this.MessageQueues[Subject] = Queue).push(Listener);
    }
}

entonces se podría hacer:

var myInstance = new MyConstructor();
myInstance.Listen("some message", callback());
myInstance.Listen("some other message", anotherCallback());
myInstance.Listen("some message", yesAnotherCallback());

y después:

myInstance.PostMessage("some message");

enviaría las colas

Esto es posible y que realmente debe utilizar una biblioteca para que, para evitar todas las incompatibilidades del navegador. Por ejemplo jQuery proporciona funcionalidad Ajax que le permite ejecutar código en la terminación de la llamada Ajax. Ver aquí para la documentación.

Si desea funciones en uso paralelo siguientes fuego:

this.handlers = [];
...
 for(var i = 0; i < this.handlers.length; i++)
  {
    setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0);
 }
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top