【问题标题】:How to wait for different http requests to receive a response (suggestions)如何等待不同的http请求收到响应(建议)
【发布时间】:2019-07-04 09:54:02
【问题描述】:

在我的应用程序中,我需要在开始创建一些对象之前进行大量 http 调用... 所以只有当所有的http请求都收到服务器的结果后,我才能处理所有的结果并构建我的页面......

为了实现这一点,我使用 forkJoin 实现了一个方法,如下所示:

    let req1 = this.http.get<MyObject>('http:/whatever/getData1');
    let req2 = this.http.get<MyObject>('http:/whatever/getData2');
    let req3 = this.http.get<MyObject>('http:/whatever/getData3');
    let req4 = this.http.get<MyObject>('http:/whatever/getData4');

    this.searchSubscription = forkJoin([Observable.of(new Object()), req1,req2,req3,req4]).subscribe(
        results => {
            console.log("data loaded let's start...");
        },
        err =>{
            console.log("Something went worg:" + err);
        }
    );

这是正确/最好的方法吗?

【问题讨论】:

  • 正确:它有效吗?最佳:您将如何确定?
  • 我没有得到你的评论,我的代码有效......
  • 那你为什么要问它是否正确?至于“最佳”,你的标准和限制是什么?
  • 再次,我没有得到您的评论,有些东西可以工作,但可能会被错误地实施......
  • 因此,如果您的代码这样做,那就是正确的。也许有“更好”的方法来写它,但不知道更好对你意味着什么,谁能告诉你?

标签: angular rxjs angular-httpclient


【解决方案1】:

我认为这不是最好的方法之一,因为在可观察的用例中,您将为每个订阅打开一个事件侦听器,如果您使用 forkjoin 执行此操作,您将无法关闭所有订阅破坏你的组件,所以如果我可以说你应该选择一个更好的解决方案,比如在你的服务上的方法中划分 observables 并一个一个地调用它们,这样你就可以在你的请求中有更多的可见性和精确度,或者只是做一个后端路由一次性获取所有这些请求的数据

【讨论】:

  • 我明白你的意思,这是一个很好的...谢谢你的建议。后端是不同的微服务,我无法创建一个将所有结果合并为一个的新服务。因此,如果我在某个时刻用不同的方法划分不同的调用,我必须等待所有结果,你将如何实现呢?再次使用 ForkJoin 还是使用不同的方法?
  • 我会使用 this.http1subscription = this.service.http1.subscribe(http1 => { this.http2subscription = this.service.http2.subscribe(http2 => { ... }) })
【解决方案2】:

对我来说,最好的方法是将 observables 转换为 Promise 并使用 Promise.all。

  let req1 = this.http.get<MyObject>('http:/whatever/getData1').toPromise();
    let req2 = this.http.get<MyObject>('http:/whatever/getData2').toPromise();
    let req3 = this.http.get<MyObject>('http:/whatever/getData3').toPromise();
    let req4 = this.http.get<MyObject>('http:/whatever/getData4').toPromise();

 const [res1,res2,res3,res4] = await Promise.all([req1,req2,req3,req4])

【讨论】:

  • 为什么你更喜欢promise而不是observable,它有什么优势吗?你能解释一下吗?
  • 代码更具可读性,现在我正在编写 Web 组件并尝试使用更少的外部库。我继续使用 observables,但如果我可以在没有 Rxjs 库的情况下做同样的事情,我更愿意这样做。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 2018-06-03
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多