15

Por lo que yo entiendo, todos los códigos JavaScript son controlados por eventos y se ejecutan en un único hilo del navegador.¿A qué subproceso se llama el código JavaScript invocado desde Flash?

Sin embargo, tengo algunas funciones de JavaScript que se llaman desde un objeto SWF que se encuentra en la misma página. ¿Este código se ejecuta de la misma manera que el código JS normal, o está en algún hilo de Flash separado?

Si está en un hilo separado, ¿puedo usar setTimeout() para ejecutarlo en el hilo de eventos JS? e.g .:

function calledFromFlash() { 
    setTimeout(doActualWork, 0); 
} 

function doActualWork() { 
    // blah blah blah 
} 

Respuesta

10

Todavía está en el mismo hilo. Sin embargo, para la mayoría de los propósitos prácticos, si tiene un JavaScript de tan larga duración que le preocupa que su tarea "principal" pueda bloquear la llamada de setTimeout, debería considerar revisar su enfoque subyacente.

Actualización de la generosidad:

Para ampliar sobre la cuestión más general de enhebrar en JavaScript, hay a great discussion con una respuesta muy reveladora de bobince. Cita algunos escenarios muy interesantes que podrían poner en duda si realmente podemos considerar que JS tiene un único hilo, y su conclusión es "no del todo".

La conclusión de los comentarios, que estoy de acuerdo, es que desde el punto de vista dentro del tiempo de ejecución de JS, el universo es de un solo subproceso, pero porque la infraestructura que rodea el recinto de seguridad JS es no un único subproceso, se puede alcanzar dentro de la caja de arena y ensuciar con estado de maneras inesperadas. Desde el interior del tiempo de ejecución, una entidad desconocida puede "suspender las leyes de la naturaleza" y cambiar las cosas. Pero el tiempo de ejecución no tiene una estructura de enhebrado para manejar ese escenario de forma nativa.

Creo que la forma más importante de abordar la cuestión es preguntarnos ¿qué queremos decir con multihebra en un escenario práctico? Por lo general, los problemas de threading se reducen a cosas como la sincronización, que debemos suponer que los proveedores de navegadores han resuelto para nosotros porque, una vez más, JavaScript no tiene una construcción nativa, incluso para tratar de manejarlo nosotros mismos. No es posible retorcerse las manos para enhebrar sin las herramientas para arreglarlo; sin mutexes o bloqueos

Así que dejando a un lado ese tipo de problemas catastróficos, estamos a punto de cosas como que tal vez un valor se nos cambie inesperadamente. Pero un código bien escrito debería estar bien con eso. Incluso en el ejemplo de Bobince, todo el código involucrado sigue siendo un código que voluntariamente incluimos en la página (incluso nos escribimos a nosotros mismos) así que seguro, podría sorprender si ese código se dispara mientras tu cuenta de llamada principal está aparentemente "bloqueada". Pero, nuevamente, hablando de problemas prácticos, ¿qué es lo peor que podrías hacerte a ti mismo en ese escenario? Nada demasiado serio.

Así que esa es mi manera larga de decir: no conozco ninguna documentación de los proveedores de navegadores donde dicen inequívocamente si su implementación JS es de un solo hilo o no, pero me pregunto si eso importa.

+0

Hola Rex, Muchas gracias por su respuesta. Un seguimiento: ¿es este el verdadero navegador cruzado, y conoce alguna referencia que lo soporte? No me preocupa que la llamada se bloquee, solo quiero asegurarme de que no haya problemas de sincronización entre el código de devolución de llamada y mis eventos regulares. – Karthik

+0

JavaScript simplemente no tiene ningún mecanismo para hacer frente a múltiples hilos. Esto en sí mismo es evidencia de que * no * tiene múltiples subprocesos. Esta publicación no es evidencia per se, pero plantea el excelente punto que las preocupaciones de enhebrar en JS son inútiles: http://damienkatz.net/2006/04/how_to_create_a.html –

+0

Si buscas en Google información sobre enhebrar en JS, lo harás. encontrar muchos blogs que dicen que JS está enhebrado, pero todo se basa en un malentendido sobre cómo funciona el motor JS en relación con su host (el navegador). –

2

Flash Las llamadas externas a la interfaz se realizan de forma síncrona utilizando la misma cadena de procesamiento que su aplicación principal. Las llamadas de Flash a JS se tratan igual que cualquier enlace de evento en su aplicación JS.

Tengo blogged about usando esto para su ventaja cuando sea necesario, aunque a menudo es una molestia.

He aquí algunos otros recursos se refieren a este hecho: linklinklinklink

Espero que ayude a aclarar las cosas.

+0

Algunos enlaces están rotos, tengo un problema que podría estar relacionado, ¿podría arreglar los enlaces? – HLL

+0

No estoy seguro acerca de cualquiera de los otros enlaces que pueden haber expirado, pero el enlace de mi blog cambió a esto: https://labs.tomasino.org/as3-synchronous-url-xml-loading.html –

Cuestiones relacionadas