Esto nos lleva a mi hacker de JavaScript favorito. Esto se hace declarando la llamada función anónima, que generalmente se ve así:
1234567(function(){/// Algo declarado aquí sólo estará disponible para la función de abajo.// El código aquí se ejecuta sólo una vez al crear la función internareurnfunction(callbackArguments){/// Actual callback here};})();// Los últimos corchetes ejecutan la función externa
javascript

Tenga en cuenta que la función externa sólo se utiliza para encapsular la función interna, y crear un ámbito variable separado para la función interna. Además, la función externa devuelve un valor de tipo Función que es el tipo exacto que debería ser una llamada de retorno. Así que, aplicando esto al ejemplo anterior llegamos aquí:
12345678910var array =[...];// Un array con algunos objetospara(var i =0; i < array.length;++i ){API.doSthWithCallbacks((function(){var j = i;// j es una copia de i sólo disponible en el ámbito de la función internareurnfunction(){ array[j].something=42;}})();}
javascript
Si, por ejemplo, hay que hacer algún procesamiento asincrónico, y debe haber algún código agregado que sólo debe ejecutarse después de que se hayan completado todas las devoluciones de llamada, todo lo que hay que hacer es saber cuántas devoluciones de llamada se han programado y contar cuántas de ellas se han completado. Si el recuento es igual a la duración, significa que estás procesando la última llamada de retorno.
12345678910111213141516var array =[...];// Un array con algunos objetosvar count =0, length = array.length;for(var i =0; i < array.length;++i ){API. doSthWithCallbacks((function(){var j = i;// Una copia de i sólo disponible en el ámbito de la función interna functionreturnfunction(){ array[j].something=42;++count;if( count == length ){/// Código ejecutado sólo después de que se hayan completado todas las tareas de procesamiento}}}}()();}
javascript
Ahora, en este punto es fácil confundirse. ¿La operación de ++cuento es atómica? Podría ocurrir una condición de carrera y el código podría ser ejecutado varias veces o, peor aún, no ser ejecutado en absoluto. Algunos consideran algo como un mutex o un semáforo. Pero esto no está bien.
Aunque JavaScript es asíncrono, no es multihilo. De hecho, mientras que es posible predecir cuando se ejecutará una llamada de retorno, se garantiza que no se producirá una condición de carrera ya que el JavaScript sólo se ejecuta en un único hilo. (Como nota al margen, eso no significa que no haya una manera de ejecutar múltiples hilos en JavaScript. Ver la API de trabajadores web para el tipo de web de JavaScript) .