Tengo un código que se parece a esto en javascript:
forloop {
//async call, returns an array to its callback
}
Una vez realizadas TODAS esas llamadas asíncronas, quiero calcular el mínimo de todas las matrices.
¿Cómo puedo esperar a todos?
Mi única idea en este momento es tener una matriz de valores booleanos llamados done, y establecer done [i] en verdadero en la función de devolución de llamada i-ésima, luego decir while (no todos están listos) {}
editar: Supongo que una solución posible, pero fea, sería editar la matriz done en cada devolución de llamada, luego llamar a un método si todos los demás hechos se establecen desde cada devolución de llamada, por lo que la última devolución de llamada para completar llamará al método continuo.
Gracias por adelantado.
javascript
asynchronous
codificadores
fuente
fuente
while (not all are done) { }
que no funcionaría. Mientras está ocupado esperando, ninguna de sus devoluciones de llamada puede ejecutarse.Respuestas:
No has sido muy específico con tu código, así que inventaré un escenario. Digamos que tiene 10 llamadas ajax y desea acumular los resultados de esas 10 llamadas ajax y luego, cuando todas se hayan completado, desea hacer algo. Puede hacerlo así acumulando los datos en una matriz y haciendo un seguimiento de cuándo ha terminado el último:
Contador manual
Nota: el manejo de errores es importante aquí (no se muestra porque es específico de cómo está haciendo sus llamadas ajax). Querrá pensar en cómo manejará el caso cuando una llamada ajax nunca se complete, ya sea con un error o se atasque durante mucho tiempo o se agote después de mucho tiempo.
Promesas de jQuery
Agregando a mi respuesta en 2014. En estos días, las promesas se usan a menudo para resolver este tipo de problema, ya que jQuery
$.ajax()
ya devuelve una promesa y$.when()
le informará cuando un grupo de promesas se resuelvan y recopilará los resultados devueltos por usted:Promesas estándar de ES6
Como se especifica en la respuesta de kba : si tiene un entorno con promesas nativas integradas (navegador moderno o node.js o usando babeljs transpile o usando un polyfill de promesa), entonces puede usar promesas especificadas por ES6. Consulte esta tabla para conocer la compatibilidad con el navegador. Las promesas son compatibles con casi todos los navegadores actuales, excepto IE.
Si
doAjax()
devuelve una promesa, puede hacer esto:Si necesita convertir una operación asíncrona sin promesa en una que devuelva una promesa, puede "promisificarla" de esta manera:
Y luego usa el patrón anterior:
Promesas de Bluebird
Si usa una biblioteca con más funciones, como la biblioteca de promesas Bluebird , entonces tiene algunas funciones adicionales integradas para facilitar esto:
fuente
doAjax()
que devuelve una promesa como una de las opciones. Lo mismo quefetch()
.Registro desde 2015: ahora tenemos promesas nativas en el navegador más reciente (Edge 12, Firefox 40, Chrome 43, Safari 8, Opera 32 y el navegador Android 4.4.4 y iOS Safari 8.4, pero no Internet Explorer, Opera Mini y versiones anteriores de Android).
Si queremos realizar 10 acciones asíncronas y recibir una notificación cuando todas hayan terminado, podemos usar la nativa
Promise.all
, sin bibliotecas externas:fuente
Promises.all()
debería serPromise.all()
.Promise.all()
en los que no se incluyen versiones actuales de IE.Puede usar el objeto Deferred de jQuery junto con el método when .
fuente
jQuery
que generalmente significa que el OP no quería una respuesta de jQuery.Puedes emularlo así:
luego cada llamada asíncrona hace esto:
mientras que en cada llamada asynch al final del método, agrega esta línea:
En otras palabras, emula una funcionalidad de pestillo de cuenta regresiva.
fuente
Esta es la forma más ordenada en mi opinión.
Promise.all
FetchAPI
(por alguna razón, Array.map no funciona dentro de .then funciona para mí. Pero puedes usar un .forEach y [] .concat () o algo similar)
fuente
return responses.map(response => { return response.json(); })
, oreturn responses.map(response => response.json())
.Utilice una biblioteca de flujo de control como
after
fuente