node.js koa 实现长轮询
长轮询的实现原理:浏览器发出请求之后,服务端资源如果没有就绪,那么并不立即返回,而是在一个时间范围内,不断地去查询资源是否就绪,如果就绪,就返回资源,如果超时了还没有就绪,就返回超时。
代码实现如下:
const Koa = require('koa'); const app = new Koa(); // response app.use(async ctx => { let rel = await Promise.race([delay(1000 * 10), getRel(1000 * 5)]); ctx.body = rel; }); function delay(ms) { return new Promise(resolve => { setTimeout(() => { resolve('delayed'); }, ms); }); } function getRel(ms) { return new Promise(resolve => { let time = new Date(); let it = setInterval(() => { if (Date.now() - time > ms) { clearInterval(it); resolve('gotRel'); } }, 10); }); } const port = 3000; app.listen(port, err => { if (err) { console.error(`err: ${err}`); } console.log(`server start listening ${port}`); });
这是超时的情况,这里是 getRel(1000 * 20)
这是返回了数据的情况,这里是 getRel(1000 * 5)
这里还有一些提升空间,比如由前端决定超时时间,比如服务端在收到请求的时候并没有立即检查资源而是在 interval 之后才开始检查。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步