【问题标题】:Angular HttpClient - getting progress messages from server before the final responseAngular HttpClient - 在最终响应之前从服务器获取进度消息
【发布时间】:2019-02-07 00:05:16
【问题描述】:

我正在使用 Angular HttpClient 服务来调用可能需要几分钟才能完成的 Web 服务。我想在最终响应之前接收进度状态(包括百分比和消息)以显示在浏览器上。 Angular 是否有机制支持这一点?

我尝试从服务器发送 100 状态,并将进度信息作为标头的一部分,但这不起作用。 HttpClient 支持 ProgressEvent api,但这仅用于跟踪多部分请求的上传/下载。

我可以创建另一个服务,然后我会在计时器上轮询,但是还有其他更标准的方法来实现吗?

【问题讨论】:

    标签: angular server


    【解决方案1】:

    您可以执行一些操作,例如为 Web 服务中的消息创建一个 BehaviorSubject,并将其连接到您的组件中以进行响应。您只需在 BehaviourSubject 中发送消息。然后,当您希望它消失时,发送一条空白消息。看看 RxJs 带来了什么。

    【讨论】:

      【解决方案2】:

      你试过Observables

      Observable 支持在发布者之间传递消息 和您的应用程序中的订阅者。 Observables 提供了显着的 优于其他事件处理技术,异步 编程和处理多个值。

      更新

      如果上述方法不起作用,您可以使用作为主要选项的计时器。

      const intervalId = setInterval(() => {
            if (CHECK IF DONE) {
                 clearInterval(intervalId);
          // DO THE THING YOU WANT AFTER COMPLETE
            }
            else {
              // GET PROGRESS
            }
          }, 1000);
      

      【讨论】:

      • 我正在使用 HttpClient post 和 request 方法来访问内部应用程序服务器(用 C++ 编写)。服务器接收请求并发送响应。对于单个请求,我可以在我的 Angular 应用程序中获得单个响应。这很好用。我想要做的是接收来自服务器的响应以获取进度信息。如果服务器发送 HTTP 状态为 200 的响应,客户端将无法接收更多响应。
      • @DalbirSingh :如果您有另一个端点来获取进度,计时器是另一种选择。
      【解决方案3】:

      我认为 Angular 没有标准的方法来做到这一点。

      在我看来,您需要向服务器发出两个请求

      • 首先,对实际运行长时间运行进程的端点的请求。该端点将在单独的线程上启动进程,并立即将该进程的 id 返回给客户端以检查状态
      • 使用从第一个请求返回的进程 ID,您可以调用检查状态端点。您可以设置检查进度和更新 UI 的时间间隔。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-12
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 2012-09-10
        • 2019-03-04
        相关资源
        最近更新 更多