javascript - funcion - mostrar loading mientras carga pagina jquery
¿Cómo hago esta función JS asíncrona? (4)
Javascript está basado en eventos, y todo sucede en un solo hilo. La forma de hacerlo "asíncrono" es usar un tiempo de espera (setTimeout ()).
function takesTime(){
for (var i = 0; i<some_very_large_number; i++){
//do something synchronous
}
console.log(''a'');
}
takesTime();
console.log(''b'');
Esto imprime: a b ¿Cómo lo harías imprimir: b a
Puede utilizar los trabajadores web para lograr su objetivo, pero necesitará un archivo js por separado y tendrá que agregar un código de plomería para publicar mensajes y manejar esos mensajes.
node.js no admite los trabajadores web de forma nativa, pero hay una implementación disponible en:
https://github.com/cramforce/node-worker/
De lo contrario, es similar al siguiente código:
var pid = require(''child_process'').spawn(''node'', [''childScript.js'']) pid.stdout.on(''data'', function(data) { console.log(data); }); console.log(''b'');
childScript.js
for (var i = 0; i < some_very_large_number; i++) { // do something synchronous } console.log(''a'');
Veo que esto está etiquetado node.js, así que lo responderé desde esa perspectiva: no deberías. Por lo general, si está bloqueando, estará: enlazado a la red (debería estar usando y / o reutilizando bibliotecas de la red en torno a métodos asíncronos), enlazado a la E / S (debería estar usando y / o reutilizando las bibliotecas de E / S ) , o enlazado a la CPU. No ha proporcionado ningún contexto para lo que es la tarea de larga duración, y dado que tiene una invariante de bucle que contiene some_very_large_number
, supongo que está imaginando una tarea que requiere una gran cantidad de CPU iterando en un campo grande.
Si realmente estás vinculado a la CPU, debes replantearte tu estrategia. El nodo solo vive en un núcleo, por lo que incluso si pudieras usar multihilo, en realidad solo estarías haciendo girar tus ruedas, ya que cada solicitud requeriría una cierta cantidad de tiempo de CPU. Si realmente tiene la intención de hacer algo de computación intensiva, es posible que desee considerar el uso de un sistema de colas y tener otra cosa que procese los datos que están mejor diseñados para analizarlos.
for (var i = 0; i < someVeryLargeNumber; ++i) {
setTimeout(function () {
//do something synchronous
}, 0);
}
También vea setZeroTimeout para ganar unos pocos milisegundos en cada bucle, aunque el trabajo que la gente está haciendo allí parece estar basado en el navegador.