Tengo una función que es la siguiente.
public getAssemblyTree(id: number) { .... const request = from(fetch(targetUrl.toString(), { headers: { 'responseType': 'json' }, method: 'GET' })); request.subscribe( (response) => { response.json().then(data => { assemblyNodesForTree.push(...this.parseAssemblyTree(data['flat_assembly_graph'])); } ) } ) console.log(assemblyNodesForTree) return assemblyNodesForTree; }Me di cuenta de que la función devuelve assemblyNodesForTree sin que se complete el observable. Me preguntaba cuál puede ser la forma correcta de hacerlo.
Está pensando en una operación asynchronous para trabajar de forma synchronous . También se refiere a la preguntaProblema que devuelve el valor de RxJS Observable . Explica un tipo de caso de uso similar.
Sugerencia rápida: use
fromFetchen lugar defrom(fetch)
¿Por qué fromFetch ? - porque utiliza internamente la API de fetch y completa el observable después de que finaliza la llamada a la API.
Te estás suscribiendo dentro de la función getAssemblyTree , que se llamará dentro de un tiempo una vez que finalice ajax. Y antes de eso, simplemente regrese, en lugar de eso, debe devolver la variable assemblyNodesForTree . Eso estará vacío siempre.
Para lidiar con la naturaleza asíncrona, puede canalizar su observable y realizar la operación relevante dentro de la función de operador de map . Al final, devuelva Promise / Observable desde la función getAssemblyTree .
public getAssemblyTree(id: number) { .... const request = fromFetch({ url: targetUrl.toString(), headers: { 'responseType': 'json' }, method: 'GET' }).pipe( map(async (response) => { const assemblyNodesForTree = []; const data = await response.json() assemblyNodesForTree.push( ...this.parseAssemblyTree(data['flat_assembly_graph']) ); return assemblyNodesForTree; }) ); return request; }Uso
async myFunction() { const assemblyNodesForTree = await lastValueFrom(getAssemblyTree(id)) } El uso de esta función va a ser bastante simple, llame al envoltorio de la función getAssemblyTree(id) con lastValueFrom (). Y tan pronto como termine la llamada a la API fromFetch , se resolverá la promesa.