node.js - 使用 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();
解决方案
推荐阅读
- css - 调整 mat-form-field 顶部边框的“中断”?
- database - 如果我们插入两个表,是否符合 REST 原则?
- automated-tests - 在赛普拉斯中,如何强制 cy.get 等待页面内容更改?
- algorithm - 算法复杂度的下限最坏情况和下限最佳情况
- javascript - Foreach 变量赋值
- css - 从节点模块导入 .css 文件时出错
- phpmailer - Phpmhailer 在 000webhost 上出现错误我无法在实时服务器中发送或接收电子邮件
- javascript - Bootstrap 3.3.7 和 Firefox 90.0 按钮“删除”有时有效
- python - ModuleNotFoundError:没有名为“pyrealsense2”的模块与 LiDAR 相机 515
- node.js - 使用阿拉伯字符将 SVG 转换为 PNG