Esperando múltiples llamadas RxJS antes de ejecutar el siguiente bloque de código.
Tengo una lista de calles y las iteraré. Dentro del bucle for, llamaré a un endpoint para cada una de estas calles. El endpoint me devuelve información sobre la calle solicitada. Quiero almacenar cada respuesta en un array de objetos y después de que todas las solicitudes hayan terminado, quiero ejecutar el siguiente bloque de código.
Aquí está mi problema:
Hago todas las llamadas, almaceno todos mis datos en el array de objetos, pero si uso en el siguiente bloque de código mi array de objetos prellenado, la longitud es igual a 0… Aquí está mi código:
export class MyComponent{
addressInfoArray: AddressInfo[] = [];
// algún código ...
prepareStreetInformations(): void {
// algún código ....
this.fillArray(streets, url);
this.doSomethingWithArray(this.addressInfoArray); // <--- la longitud es 0 y no espera a que termine el método fillArray()
}
}
fillArray(streets: Street[], url: string): void { // streets tiene una longitud de 150
for (const street of streets) {
this.http.get<addressinfo>(`${url}/street.name`).subscribe(response => {
this.addressInfoArray.push(response);
});
}
}
Entonces mi pregunta es: ¿Cómo puedo hacer que el método doSomethingWithArray() espere a que el método fillArray() haya terminado por completo y por qué el método doSomethingWithArray() no ve que mi array de objetos ya está lleno?
davy.ai
Para que el método
doSomethingWithArray()
espere la finalización del métodofillArray()
, se pueden utilizar promesas u observables. Con observables, se puede utilizar el operadorforkJoin()
para esperar a que todas las solicitudes HTTP finalicen antes de ejecutar el siguiente bloque de código. Así es cómo se puede modificar el código utilizando observables:En el método
fillArray()
, utilizamos la funciónmap()
para crear un array de observables que representan las solicitudes HTTP. Luego, utilizamos la funciónforkJoin()
para esperar a que todos los observables se completen y emitan sus valores como un array de respuestas. Devolvemos este array como un observable desde el métodofillArray()
, que se puede suscribir en el métodoprepareStreetInformations()
. En este método, asignamos las respuestas a la propiedadaddressInfoArray
y luego llamamos al métododoSomethingWithArray()
.La razón por la que el método
doSomethingWithArray()
ve la longitud deaddressInfoArray
como 0 es porque las solicitudes HTTP son asíncronas, lo que significa que se están ejecutando en segundo plano mientras el hilo principal continúa ejecutando el resto del código. Por lo tanto, cuando llamas al métododoSomethingWithArray()
inmediatamente después de llamar al métodofillArray()
, es posible que las solicitudes HTTP aún no se hayan completado y que eladdressInfoArray
no esté completamente poblado. Al utilizar observables para esperar la finalización de las solicitudes HTTP, te aseguras de queaddressInfoArray
esté completamente poblado antes de pasarlo al métododoSomethingWithArray()
.</addressinfo[]>