Implementé una función que uso para llamar a una API, recuperar información para cada producto y enviarla a la matriz. Después de haber hecho esto para todos los productos, haría una acción con la matriz.
Así que tengo:
newProducts: any = [] loadOfferRelated(offer) { // consider this offer with 2 products array. let products = offer.products for (let i = 0; i < products.length; i++) { let apiCall = this.offerService.apiCall(products[i].id, product.catalogId) apiCall.pipe(untilDestroyed(this)).subscribe( (data) => { operationOnArray(data, products[i])} ) } if(this.newProducts.length > 0){ // ---> Here i should call another function but it doesn't enter there) } operationOnArray(data, product){ // I make some operation product and save in array this.newProducts.push(products) console.log("this.newProducts", this.newProducts) <-- this is every for populated + 1 return }Tengo un problema para llamar al if cuando se completa la matriz newProducts, ¿cómo puedo hacerlo?
De acuerdo, puede usar un forkJoin para hacer las llamadas a la API simultáneamente y usar el operador de map para devolver cada elemento transformado, insertar los datos devueltos en la matriz y finalmente llamar a la condición if.
newProducts: any = []; loadOfferRelated(offer) { // consider this offer with 2 products array. let products = offer.products; const apiCalls = products .map((product: any) => this.offerService.apiCall(product.id, product.catalogId)) .pipe( map((data: any, i: number) => { // i am not sure what your doing with the api call (data) so I am merging product and data, you customize // to your requirement return { ...products[i], ...data }; }) ); forkJoin(apiCalls).subscribe((newProducts: Array<any>) => { this.newProducts = newProducts; if (this.newProducts.length > 0) { // ---> Here i should call another function but it doesn't enter there) } }); }Su problema es que todo lo que sucede en su suscripción es asíncrono. Eso significa que su si se activa antes de que finalice su solicitud, por lo que es muy probable que su condición si siempre termine con un falso.