Angular HTTP 中的lastValueFrom 和firstValueFrom 等价吗?

Mat*_*ias 21 observable rxjs angular-http angular angular-httpclient

在 Angular 中,我们使用 HttpClient 进行 HTTP 调用,该调用返回可观察值,如果我们想使用 Promise,我们可以使用lastValueFrom/firstValueFrom.

假设我们有:

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$);
}
Run Code Online (Sandbox Code Playgroud)

res1 和 res2 总是相等吗?正确使用的版本是什么?

lag*_*man 28

Angular HTTP 客户端中,是的,它们是。这就是为什么

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();
Run Code Online (Sandbox Code Playgroud)

之后observer.next(...)observer.complete()被同步调用。lastValueFrom由于这是同步调用,因此使用or没有区别firstValueFrom

这里唯一的区别是,一旦被调用firstValueFrom就会解决 Promise ,而一旦被调用就会解决 Promise 。由于和被同步调用,一个接一个,所以这里实际上没有太大区别。next(...)lastValueFromcomplete()nextcomplete

但是,这里需要注意的一件事是:如果您正在使用reportProgress = true,您将需要使用lastValueFrom,因为您希望捕获从生产者发出的最后一个值 - 即响应或错误。您不想通过进度状态更新来解决 Promise。如果你这样做,那么你根本就不想使用 Promise。


kve*_*tis 9

在基本用法中HttpClient.get(url)- 没有任何附加选项,例如observe: eventsreportProgress: true- 两个版本是等效的,您可以使用您喜欢的任何一个。observable只会发射一次或失败,因此 和 的lastValueFrom行为firstValueFrom都是相同的。