我正在编写一个小型的内部Web应用程序,它可以读取表单数据并创建一个excel文件,然后通过电子邮件发送给用户。
但是,我正在努力了解如何在完成流程时为用户实施实时更新。有时该过程需要10秒钟,有时该过程需要5分钟。
目前,用户在看到任何结果之前一直等待流程完成 - 他们在流程完成时看不到任何更新。在显示报告信息之前,前端等待来自服务器的 201响应,并且用户被“阻止”,直到RC完成。
我很难理解如何异步启动报告创建(RC)过程,同时允许用户导航到网站的其他页面。或者查看后台发生的更新。我在此应该澄清一下,RC流程中的一些步骤使用Promises。
我想每秒轮询服务器以获取正在生成的报告的更新。
以下是一些简单的代码来澄清我的理解:
端点
// CREATE REPORT
router.route('/report')
.post(function(req, res, next) {
// Generate unique ID to keep track of report later on.
const uid = generateRandomID();
// Start report process ... this should keep executing even after a response (201) is returned.
CustomReportLibrary.createNewReport(req.formData, uid);
// Respond with a successful creation.
res.status(201);
}
}
// GET REPORT
router.route('/report/:id')
.get(function(req, res, next){
// Get our report from ID.
let report = CustomReportLibrary.getReport(req.params.id);
// Respond with report data
if(report) { res.status(200).json(report); }
else { res.status(404); }
}
CustomReportLibrary
// Initialize array to hold reports
let _dataStorage = [];
function createNewReport(data, id) {
// Create an object to store our report information
let reportObject = {
id: id,
status: 'Report has started the process',
data: data
}
// Add new report to global array.
_dataStorage.push(reportObject);
// ... continue with report generation. Assume this takes 5 minutes.
// ...
// ... update _dataStorage[length-1].status after each step
// ...
// ... finish generation.
}
function getReport(id) {
// Iterate through array until report with matching ID is found.
// Return report if match is found.
// Return null if no match is found.
}
根据我的理解,即使在返回201响应后,CustomerReportLibrary.createNewReport()
也会在后台执行。在前端,我会按时间间隔对/report/:id
进行AJAX调用,以获取我的报告的更新。这是正确的方法吗?有更好的方法吗?
答案 0 :(得分:1)
我认为你是在正确的道路上。 HTTP 202(该请求已被接受处理,但处理尚未完成)是处理您案件的正确方法。
可以这样做:
客户端发送POST /reports
,服务器开始创建新报告并返回:
202 Accepted
Location: http://api.domain.com/reports/1
GET /reports/1
以获取报告的状态以上所有流程都是异步的,因此用户不会被阻止。