node.js - 返回多个异步响应
问题描述
我目前正在寻找一个接受请求的端点,并在加载时以增量方式返回响应数据。
它的应用是给定一次数据上传,我想为该数据计算许多不同的指标。由于每个指标都是异步计算的,我想将此指标的值返回到前端进行渲染。
为了测试,我的控制器如下所示,尝试使用 res.write
uploadData = (req, res) => {
res.write("test");
setTimeout(() => {
res.write("test 2");
res.end();
}, 3000);
}
但是,我认为问题源于我在 React-Redux 中编写的客户端,并通过 Axios 调用调用了该路由。据我了解,这是因为 axios 请求在收到第一个响应后关闭,并且连接不会保持打开状态。这是我的 axios 调用的样子:
axios.post('/api', data)
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
是否有捷径可寻?我也考虑过流式传输,但是我对流式传输的担忧是,我希望每个连接在短时间内打开的客户端之间都是直接且唯一的(即仅在计算指标时打开)。
我还应该提到,正在上传的资源是一个数据库,我想避免由于多个端点而多次解析和打开连接。
在此先感谢,如果我能提供更多上下文,请告诉我
解决方案
在仍然使用传统 API 的同时处理此问题的一种方法是将指标存储在某个对象中,例如数据库或 redis,然后只需长轮询资源。
对于现实世界的示例,假设您要计算 foo、完成时间、请求长度、bar、foobar 的以下指标。
您可以在存储中创建一个如下所示的对象:
{
id: 1,
lengthOfRequest: 123,
.....
}
然后您将在您的 API 中创建一个类似的端点metrics/{id}
并返回该对象。只需继续调用路线,直到一切完成。
当然,这有一些明显的缺点,但是一旦您获得足够的信息以了解指标平均需要多长时间才能完成,您可以调整调用 API 之间的时间。
推荐阅读
- python - python内部类如何创建
- c# - 如何使用 C# MSGraph 将日历事件添加到 Outlook 365
- javascript - 反应:路由器进程问题
- objective-c - Xcode 错误消息:“'UIAlertAction' 没有可见的@interface 声明选择器....”
- javascript - Highchart 示例在单独的 html 页面中不起作用
- javascript - React:在另一个组件中使用组件
- api - CURL Tableau 休息 API
- javascript - HTML 锚发送请求但不关注链接
- android - iOS 配置文件是否类似于 Android 清单文件
- c# - Azure 服务队列的批处理或取消处理