一、需求场景
在某个功能模块里,产品提出:需要显性展示关闭操作后的进度,如下图。
二、思路来源
既然是个实时获取的进度值,首先要考虑性能。
如果能够从前端直接连接Redis,通过约定的KEY获取缓存里的数值,再好不过。
2.1 redisGet方法 + id
1)连接Redis
const redis = require('redis');
const { REDIS } = require('../config/config.js');
const client = redis.createClient({
host: REDIS.host,
port: REDIS.port,
password: REDIS.password,
db: REDIS.database
});
const redisGet = (param) => {
return new Promise((resolve, reject) => {
client.get(param, (err, reply) => {
if (err) {
reject(err);
}
if (reply) {
resolve(reply.toString());
} else {
reject();
}
});
});
};
module.exports = { client, redisGet };
2)组装KEY值并发出请求
let tenantId = req.session.userInfo.tenantId;
let id = req.query.id;
try {
const redisResult = await redisGet(`126:accountprogress:${tenantId}:${id}`);
const redisResultObj = redisResult ? JSON.parse(redisResult) : {};
LogUtil.proxy(`redisKEY--------------【SUCCESS】126:accountprogress:${tenantId}:${id}`);
LogUtil.proxy(`redisResult-----------${redisResult}`);
let str = '';
let error = 1;
if (redisResultObj && redisResultObj.code === '12600000') {
// 接收成功
str = redisResultObj.result;
} else {
// 接收失败
str = redisResultObj.result || '';
error = 2;
}
res.render(`${tenantpath}/accountperiodarchives/progress`, {
htmltype: 'accountperiodarchiveshome',
str: str,
errorcode: error
});
} catch (error) {
// 已无缓存
LogUtil.proxy(`redisKEY-------【ERROR】126:accountprogress:${tenantId}:${id}`);
res.render(`${tenantpath}/accountperiodarchives/progress`, {
htmltype: 'accountperiodarchiveshome',
str: '进度获取失败,请重试!',
errorcode: 3
});
}
3)展示获取的result
2.2 调取progress.ejs
实现逻辑完成后,什么时候调取、如何调取?—— 获取账期列表时发起,通过定时器发起。
- 进度属于中间状态,位于未记账和已关账之间。这种数据有且仅有一条:
- 确认账期id后,通过returnHTML渲染 记账进度模块,也就是progress.ejs内容:
- 之后,通过3秒定时器开始实时获取:
2.3 思路来源
参考项目使用的 前端服务器 概念,获取记账进度的实现思路相当于封装一个ajax请求,获取html。
function returnHtml(url, data, fn) {
$.ajax({
url: '/rpsm-web' + url,
type: 'get',
dataType: 'html',
data: data,
complete: function (xhr) {
fn && fn(xhr.responseText);
}
});
}
把router注册的 /accountPeriodArchives/progress 当做接口,用returnHtml调用:
router.get('/accountperiodarchives/progress', async (req, res, next) => {
...
});
三、总结
目前项目还是基于nodeJs在开发,连接redis获取缓存key的方式仅供参考。
欢迎路过指正。