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)app

 

 

这是返回了数据的状况,这里是 getRel(1000 * 5)koa

 

 

这里还有一些提高空间,好比由前端决定超时时间,好比服务端在收到请求的时候并无当即检查资源而是在 interval 以后才开始检查。async

相关文章
相关标签/搜索