Estoy trabajando en un Backend For Frontend (BFF) que recibe una solicitud por parte del front-end, el bff solicita otra api y con las respuestas, crea el objeto para volver al front-end.
Quisiera saber si estoy usando promesas y espero llamada correctamente, hay dos situaciones:
const [affiliates, { content }]: [ { content: AffiliateType[] }, IManagerTypeList, ] = await Promise.all([ await this.affiliatesService.getAffiliates( { clientId: client?.id }, ), await this.managersService.getManagers( { clientId: client?.id }, ), ]) getAffiliates y getManagers son métodos asíncronos que llaman a otra API. El content constante vuelvo directamente al front-end. Con affiliates , hago lo siguiente:
const unresolvedTransformedAffiliateToReturn = affiliates.content.map( async (affiliate): Promise<AffiliateType> => { const addressInfo: AddressType = await this.addressService.getAddressesById( affiliate.addressId, ) const managerInfo: ManagersType = await this.managersService.getManagers( affiliate.managerId, ) return { id: affiliate.id, name: affiliate.name, clientId: affiliate.clientId, managerId: affiliate.managerId, addressId: affiliate.addressId, address: addressInfo, manager: managerInfo, } }, ) const transformedAffiliateToReturn = await Promise.all( unresolvedTransformedAffiliateToReturn, ) Que esta pasando aqui. affiliates.content es una matriz de objetos. Necesito usar algunas variables de afiliado para llamar a los puntos finales de getAddressesById y getManagers (también asíncronos), como addressInfo y managerInfo, luego, use este retorno para volver al front-end.
El retorno final al front-end es:
{ managers: content, affiliates: transformedAffiliateToReturn, }Todo funciona correctamente. Solo me pregunto si es la forma correcta de usar las funciones de promise.all y async/wait.
Algunas opiniones o sugerencias serán apreciadas. ¡Gracias!
EDITAR: Ejemplo de solicitud getAffiliates :
getAffiliates<R>(id: number, api?: string): Promise<R> { return this.customHttpService.mountRequest( RequestTypeEnum.GET, `/endpoint/${id}`, null, null, null, api, true, )}
alcance mountRequest :
async mountRequest<P, B, H, R>( requestType: RequestTypeEnum, endpoint: string, params?: P, body?: B, headers?: H, api?: string, ignoreNotFoundError?: boolean, ): Promise<R> { const defaultApi: string = api ? api : let request: Observable<AxiosResponse<R>> ... } )