首页 > 解决方案 > 使用 Angular 可观察对象订阅来自 Node 的分块字符串数据,以便在块交付后立即显示它

问题描述

背景:Angular 推荐用于应用程序开发的 observables - 它们与 Promises 不同,因为 promises 在解决或拒绝(一个事件)时完成,而 observables 可以处理数据流(多个事件)。我的问题不是选择一个,而是从 NodeJS 读取数据流。

深入研究 observable,我们看到了从事件流、客户端生成的数据流(表单数组,在 setInterval)等中的可观察读取。我的问题是关于 observables(发布者 - 订阅者模型)用于订阅 nodeJS/ expressJS 后端,它将是这里的发布者——它以固定的时间间隔发送简单的 res.write。

我尝试了什么,发生了什么...... 当我们使用 observable 并生成这个字符串数据流时,只有在后端完成后才会显示结果...... observable 调用被挂起......

我想发生什么? 使用 Angular 和 observables,订阅这些数据并在生成时(在服务器端)显示它(在客户端)的方式是什么

使用 NodeJS / Express JS 的服务器端代码

app.get('/obs/responseWriteNEW', cors(), function(req, res) {
  var completedWrite = false;
  try {

    var j = 0;
    const headers = {
      'Content-Type': 'text',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
      'Access-Control-Max-Age': 2592000, // 30 days
    };
    res.writeHead(200, headers);

    var i = 0;
    setInterval(function() {
      if (i < 100) {
        var myObj = {
          responseWriteNEW: i
        };
        var myStr = JSON.stringify(myObj);
        console.log(myStr);
        res.write(myStr);
        i++;
      } else {
        res.end();
      }
    }, 250);

  } catch (expp) {
    console.log(expp);
  }

});

客户端代码 https://stackblitz.com/edit/angular-44sess

使用 vanilla-JS,我们在流数据的长度超过 1030 后打印了第一块数据。

xhr = new XMLHttpRequest();
xhr.addEventListener("progress", function(ev) {  console.log(ev.target.responseText); $("#ajaxLog").append(ev.target.responseText); });
xhr.open("GET", 'http://localhost:2025/obs/responseWriteNEW');
xhr.send();

标签: node.jsangularexpressobservablechunked

解决方案


推荐阅读