2011-01-17 15 views
11

Tengo muchas llamadas asincrónicas AJAX cuyos resultados se procesarán. No importa en qué orden se produce el procesamiento, pero los resultados deben procesarse de uno en uno. Así que me gustaría hacer simplemente mis llamadas AJAX y todas simplemente colocan sus resultados en una sola cola. Esa cola debe procesarse en un solo hilo. De esta forma, los resultados se procesan uno a la vez lo antes posible.Cola segura para subprocesos en Javascript o jQuery

¿Cuál es la mejor manera de hacerlo? Estoy usando jQuery, estoy feliz de aprovechar las instalaciones que ofrece para esto.

Respuesta

25

asíncrona no significa "múltiples hilos. Piense en muchos eventos de clic que se activan en una fila, antes de que se procese el primer controlador de clic. Solo se puede manejar una acción a la vez, y las otras esperarán para ejecutarse.

Los lenguajes controlados por eventos como Javascript funcionan sobre la base de una cola. Javascript en segundo plano tiene esencialmente una cola gigante a la que los eventos y las respuestas asincrónicas se insertan. Una vez que se completa un fragmento de procesamiento en particular, se trabaja en el siguiente elemento de la cola.

Estas colas a veces se conocen como 'Runloops'. Javascript girará en un bucle sin fin, recuperará un evento de la cola, lo procesará y regresará a la cola para otro trabajo.

El subprocesamiento múltiple se puede lograr en versiones (más nuevas) de Javascript usando Web Workers, pero estas son explícitamente habilitadas. Búscalos si estás interesado.

Para responder a su pregunta, simplemente adjunte una devolución de llamada a su solicitud asíncrona, y se completará el procesamiento, incluso si se devuelve otra respuesta a la mitad. La otra respuesta 'esperará' hasta que se maneje el evento actual.

+6

Creo que todo el mundo está complicando demasiado la pregunta porque usaba la palabra 'hilos'. Creo que OP simplemente significa que necesita que cada devolución de llamada se complete por completo antes de que comience la próxima. Asumo que, debido a que jQuery está involucrado, esto se debe a que se está produciendo algún tipo de animación, que utilizará temporizadores y, por lo tanto, aparecerá con múltiples subprocesos (puede que dos devoluciones de llamada parezcan ejecutarse al mismo tiempo). – beeglebug

+0

@beeglebug - No creo que tengas razón. El OP declara explícitamente "No importa en qué orden se produce el procesamiento". Es un concepto erróneo común que asíncrono significa multihilo, y creo que el OP tenía esta misma impresión. –

+0

@Josh Smeaton - Posiblemente, pero podríamos con OP volver y arrojar algo de luz. Todo se reduce a si "procesamiento" significa crujido de números en bruto o algo más basado en la interfaz de usuario. Y con jQuery involucrado (y al echar un vistazo al historial de preguntas de OP) estoy pensando que es UI/animación. – beeglebug

5

Si su única preocupación es el navegador (ya que menciona jQuery, supongo que es cierto), debe saber que Javascript is single-threaded in browsers.

+2

Guau, no estaba al tanto de esto y parece extraño ... así que puedo hacer 100 solicitudes AJAX, y parece que estas solicitudes son asíncronas y en hilos separados, y las funciones de devolución de llamada se llamarán una a la vez ? –

+0

Creo que es correcto. –

+0

@dorktitude - En realidad, JavaScript ahora tiene múltiples subprocesos, gracias a WebWorkers: https://developer.mozilla.org/En/Using_web_workers – jmort253

0

La manera más simple sería implementar su propio sistema de cola para las devoluciones de llamada (usando push/pop para emular una pila).

Como cada solicitud asíncrona retorna, agregue los datos al final de una matriz y ejecute algún tipo de comando queue.process(), que manejaría el primer elemento de la matriz.

Por último, agregue algo como if(alreadyRunning) { return; } a la parte superior de esa función para detenerlo haciendo más de uno a la vez, y tiene su cola de rosca única.

edición: código eliminado, algunas personas fueron quedarse atascado en él en lugar de la pregunta original

+0

El único momento en que habrá varios elementos en su cola es si el 'this.handler (elemento)' empuja otro elemento de trabajo a la pila. No hay absolutamente ninguna necesidad de esto, ya que la mayoría de las llamadas asíncronas pueden aceptar devoluciones de llamada cuando se completen. –

+0

Pensé que la idea era que algún código externo se activaría con llamadas ajax, y usando 'queue.add' como devolución de llamada. De esta forma, los datos de retorno se agregarían a la cola, y si se devolvía una segunda pieza de datos mientras se procesaba la primera, se agregaría a la cola para que se procese una vez que la primera haya finalizado. – beeglebug

+0

Imposible. Otra pieza de devolución de datos NO se puede ejecutar mientras la primera todavía está en proceso. Esperará hasta que el único hilo se vuelva "libre" para hacer el trabajo. El 'queue.add' es redundante. Simplemente adjunte el controlador directamente a cada solicitud asincrónica. –

0

Es posible que desee echar un vistazo a Event messaging between JavaScript objects.

utilicé una implementación similar a la entrada del blog con un jQuery plugin llamado ajaxMonitor.

La forma en que funciona tan pronto como se llama a cualquiera de las devoluciones de llamada AJAX actualiza una tabla HTML. Las devoluciones de llamada suceden de forma asíncrona.

La naturaleza misma de AJAX significa asíncrona. Así que procesar su QUEUE en la exitosa devolución de llamada de su solicitud de AJAX, creo que lograría lo que está buscando.

Cuestiones relacionadas