zoukankan      html  css  js  c++  java
  • 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 之后才开始检查。

  • 相关阅读:
    Vue 项目中 ESlint 配置
    ajax、axios、fetch 对比
    vue 中 axios 使用
    NodeJS 多版本管理(NVM)
    axio 请求中参数是数组
    Python 图片文字识别
    .NET 使用 VLC 播放视频
    Python 常见问题
    SpringBoot(4) SpringBoot热部署
    SpringBoot(3) 文件上传和访问
  • 原文地址:https://www.cnblogs.com/lswit/p/10616505.html
Copyright © 2011-2022 走看看