【问题标题】:are lastValueFrom and firstValueFrom equivalent in Angular HTTP?Angular HTTP 中的 lastValueFrom 和 firstValueFrom 是等价的吗?
【发布时间】:2021-10-19 11:06:04
【问题描述】:
在 Angular 中,我们使用 HttpClient 进行 HTTP 调用,返回一个 observable,如果我们想使用 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$);
}
res1 和 res2 总是等价的吗?使用的正确版本是什么?
【问题讨论】:
标签:
angular
rxjs
observable
angular-httpclient
angular-http
【解决方案1】:
在Angular HTTP client,是的,他们是。 This is why:
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();
在observer.next(...) 之后,observer.complete() 被同步调用。由于这是一个同步调用,所以使用lastValueFrom 或firstValueFrom 没有区别。
这里唯一的区别是 firstValueFrom 将在 next(...) 被调用时解析 Promise,而 lastValueFrom 将在 complete() 被调用时解析 Promise。由于next和complete是同步调用的,一个接一个,这里真的没有太大区别。
但是,这里要注意的一点是:如果您使用的是 reportProgress = true,您将需要使用 lastValueFrom,因为您想捕获生产者发出的最后一个值 - 即响应或错误。您不想通过进度状态更新来解决 Promise。如果你这样做了,那么你根本不想使用 Promises。
【解决方案2】:
在HttpClient.get(url) 的基本用法中 - 没有任何附加选项,例如 observe: events 或 reportProgress: true - 两个版本是等效的,您可以使用任何您喜欢的版本。 observable 只会发射一次或失败,因此lastValueFrom 和firstValueFrom 的行为将相同。