ejemplos - javascript html
¿Qué hilo ejecuta el código JavaScript desde Flash? (2)
Las llamadas Flash ExternalInterface 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.
He escrito sobre el uso de esto para su ventaja cuando es necesario, aunque a menudo es una molestia.
Aquí hay algunos otros recursos que hacen referencia a este hecho: link link link link
Espero que eso ayude a aclarar las cosas.
Por lo que yo entiendo, todos los códigos de JavaScript son controlados por eventos y se ejecutan en un único hilo del navegador.
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? p.ej:
function calledFromFlash() {
setTimeout(doActualWork, 0);
}
function doActualWork() {
// blah blah blah
}
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 para la recompensa:
Para ampliar la cuestión más general de enhebrar en JavaScript, hay una gran discusión 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, con los que estoy de acuerdo, es que desde la perspectiva dentro del tiempo de ejecución de JS, el universo tiene un solo subproceso, pero como la infraestructura que lo rodea no es de subproceso único, puede alcanzar dentro de la zona de pruebas y la suciedad 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 acostumbrados a 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 gran manera de decir: no conozco ninguna documentación de los proveedores de navegadores en los que digan inequívocamente si su implementación JS es de un único subproceso o no, pero me pregunto si eso importa.