长轮询的实现原理:浏览器发出请求之后,服务端资源如果没有就绪,那么并不立即返回,而是在一个时间范围内,不断地去查询资源是否就绪,如果就绪,就返回资源,如果超时了还没有就绪,就返回超时。

代码实现如下:

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 之后才开始检查。

转载于:https://www.cnblogs.com/lswit/p/10616505.html

最新文章

  1. 在sqlserver中做fibonacci(斐波那契)规律运算
  2. 记账类APP竞品分析-挖财与随手记
  3. mysql解决自动断开8小时未曾用过的链接
  4. nyoj739_笨蛋难题四
  5. swiper初步探索
  6. Postman Postman测试接口之POST提交本地文件数据
  7. UVa 1225 Digit Counting --- 水题
  8. C#的垃圾回收机制及弱引用
  9. Swift - 36 - 结尾闭包(Trailing closure)和捕获数值(Capturing Values)的简单介绍
  10. python3.4+selenium爬58同城(一)
  11. 被FusionCharts V3.4抛弃的东西
  12. 修改MAC地址的方法 破解MAC地址绑定(抄)
  13. 关于boost中enable_shared_from_this类的原理分析
  14. 视图模型-Lambda表达式
  15. ssh整合not found class 异常总结
  16. Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Java语言中System.out.print与Log的比较
  17. DB2 to mysql
  18. Angular js部分关键字的理解
  19. 从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
  20. 阅读笔记《JavaScript语言精粹》

热门文章

  1. C++primer(第五版)Sales_item.h头文件
  2. 配置samba和NFS共享服务
  3. mysql--使用left join条件查询时加where条件的问题
  4. Django常用的第三方包
  5. MySQL数据库三
  6. JAVA debug 调试demo
  7. std::string 字符串分割
  8. std::string::insert函数
  9. 008-进制-C语言笔记
  10. ******Prometheus(二)***********