En angular, usamos HttpClient para hacer llamadas HTTP que devuelven un observable, si queremos usar promesas, podemos usar lastValueFrom/firstValueFrom .
Digamos que tenemos:
async getLast() { const get$ = this.http.get(url); const res1 = await lastValueFrom(get$); } async getFirst() { const get$ = this.http.get(url); const res2 = await firstValueFrom(get$); }¿res1 y res2 son siempre equivalentes? ¿Cuál es la versión correcta para usar?
En el cliente Angular HTTP , sí, lo son. Por eso :
observer.next(new HttpResponse({ body, headers, status, statusText, url: url || undefined, })); // The full body has been received and delivered, no further events // are possible. This request is complete. observer.complete(); Después de observer.next(...) , se llama a observer.complete() de forma síncrona. Dado que se trata de una llamada síncrona, no hay diferencia en usar lastValueFrom o firstValueFrom .
La única diferencia aquí es que firstValueFrom resolverá la Promesa una vez que se llame a next(...) , mientras que lastValueFrom resolverá la Promesa una vez que se llame a complete() . Dado que next y complete se llaman sincrónicamente, uno tras otro, realmente no hay mucha diferencia aquí.
Sin embargo, una cosa a tener en cuenta aquí es: si está usando reportProgress = true , querrá usar lastValueFrom ya que le gustaría capturar el último valor emitido por el productor, es decir, la respuesta o el error. No desea resolver la Promesa con la actualización del estado de progreso. Si lo hace, entonces no querrá usar Promesas en absoluto.
En el uso básico de HttpClient.get(url) , sin opciones adicionales como observe: events o reportProgress: true , ambas versiones son equivalentes y puede usar la que desee. El observable emitirá solo una vez o fallará, por lo tanto, tanto lastValueFrom como firstValueFrom se comportarán de la misma manera.