Estoy tratando de hacer la tarea paso a paso.
Tengo un bucle for en un método:
async changeTimeStep3() { for (let i = 1; i < 10; i++) { await this.do(i) } }para cada paso debe hacer () tarea.
do(i) { this.http .getDataFromServer( "api/example?id=" +i ) .subscribe((response) => { console.log(i); }); } Quiero esperar para obtener una respuesta y después de que llegue la respuesta, ir a la siguiente i
Pero no funciona la impresión de console.log:
2 3 5 1 4 7 8 9 6Tenga en cuenta que el tiempo para recibir la respuesta de la API no es fijo.
¿Alguna ayuda?
Para que su bucle imprima los valores en el orden correcto, puede transformar sus observables en promesas, por lo que su await bloqueará el bucle for siempre que la llamada HTTP no se haya resuelto.
import { firstValueFrom } from 'rxjs'; ... async do(i: number) { await firstValueFrom( this.http .getDataFromServer( "api/example?id=" +i ) ); console.log(i); } El uso firstValueFrom o lastValueFrom son las formas RxJS de obtener una promesa como valor de retorno de un observable (dado que toPromise quedó en desuso, puede leer más sobre eso aquí ).
Puede devolver una Promise y usar resolve() en respuesta a su ajax. Me gusta:
do(i) { return new Promise((resolve, reject) => { this.http.getDataFromServer("api/example?id=" +i).subscribe((response) => { resolve(response); }, (error) => { console.error(error); reject(); }); }); }El problema aquí es que do no es un método asíncrono; es un método síncrono que activa uno asíncrono. Como tal, la espera se completa inmediatamente.
Es posible que puedas hacer esto:
do(i) { return firstValueFrom(this.http .getDataFromServer( "api/example?id=" +i )) }Convierte lo observable en una promesa y lo devuelve. Entonces, ahora el método do() devuelve un objeto asíncrono. Para generar desde el método do; puedes usar una pipa:
return firstValueFrom(this.http .getDataFromServer( "api/example?id=" +i ).pipe(tap((result) => {console.log(i);}))Dicho todo esto, usar async/await en Angular es inusual. Un operador RXJS generalmente se considera el enfoque correcto. Posiblemente con concat