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

相關文章
相關標籤/搜索