【问题标题】: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() 被同步调用。由于这是一个同步调用,所以使用lastValueFromfirstValueFrom 没有区别。

    这里唯一的区别是 firstValueFrom 将在 next(...) 被调用时解析 Promise,而 lastValueFrom 将在 complete() 被调用时解析 Promise。由于nextcomplete是同步调用的,一个接一个,这里真的没有太大区别。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2012-11-22
        • 2018-06-17
        • 2016-06-05
        • 2016-01-01
        • 1970-01-01
        相关资源
        最近更新 更多