Tengo un servicio que se conecta con api.
export class ConsolidadoApi { constructor(private http: HttpClient) { } getInvestiments(search?: any): Observable<any> { return this.http.get<any>(`${environment.basePosicaoConsolidada}`); } }Responde esta API:
https://demo5095413.mockable.io/consolidado
Este es el responsable de la lógica antes de llegar al componente.
@Injectable({ providedIn: 'root' }) export class CoreService { public test; constructor(private api: ConsolidadoApi, private state: StateService) { } public createMenu() { this.api.getInvestiments() .subscribe(response => { console.log(response.carteiras[0]) this.products = response.carteiras[0] return this.products; }) }En mi componente
export class MenuComponent implements OnInit { constructor( private coreService : CoreService ) {} ngOnInit(): void { console.log(this.coreService.createMenu()) } }Pero cuando se llama a createMenu en menu.component.ts, no está definido.
La respuesta cruda es un objeto. forEach solo funciona en una matriz. Si está apuntando a forEach en 'categorías', debería intentar
this.test.categorias.forEach()Cuando devuelves Observable<any> , eso significa que el argumento de la lambda que creas cuando te subscribe (que nombraste response ) es type any . No es necesario que tenga definida la función forEach (a menos que la API devuelva un objeto con ese prototipo). Generalmente es por eso que usar any no es una buena práctica; no puede tener ninguna expectativa sobre lo que puede contener el objeto. De hecho, es posible que no esté en el objeto (podría ser una matriz ya que any no es exclusivamente un objeto). Si desea utilizar forEach , querrá asegurarse de que la response sea de tipo array . Puede inspeccionar el tipo de objeto antes de usarlo (por ejemplo, usando typeof ) y juzgar qué llamar o incluso simplemente verificar si la función que está tratando de usar está definida primero, por ejemplo, if (response.forEach !== undefined) . Sin embargo, en realidad no necesita comparar con undefined, por lo que if (response.forEach) es suficiente. En los ejemplos, usé response , pero puede usar this.test ya que son el mismo objeto después de la primera línea en la lambda.
Según el enlace que compartió, la respuesta es un objeto. Puede iniciar sesión en la consola para confirmar.
Solo puede llamar a cada uno en una matriz, por ejemplo, en función de la API de respuesta, puede llamar a forEach en la propiedad 'categorias' y en la propiedad secundaria de esa matriz 'produtus'
Editar: esta respuesta se basó en la API y la pregunta originales de op
https://demo5095413.mockable.io/carteira-investimentos
public createMenu() { return this.api.getInvestiments() } ngOnit() { this.coreService.createMenu().subscribe(x => console.log(x.categorias))}; { "codigo":1, "categorias":[ { "nome":"Referenciado", "valorTotal":23000.0, "codigo":"2", "produtos":[ { "nome":"CDB Fácil Bradesco", "valor":2000.0, "codigo":1, "quantidade":0.0, "porcentagem":0.5500, "aplicacaoAdicional":500.0, "codigoInvest":1, "salaInvestimento":"CDB", "permiteAplicar":true, "permiteResgatar":true, "movimentacaoAutomatica":false, "ordemApresentacao":37, "horarioAbertura":"08:30", "horarioFechamento":"23:59", "codigoGrupo":0, "codigoMF":"001