長輪詢的實現原理:瀏覽器發出請求以後,服務端資源若是沒有就緒,那麼並不當即返回,而是在一個時間範圍內,不斷地去查詢資源是否就緒,若是就緒,就返回資源,若是超時了尚未就緒,就返回超時。前端
代碼實現以下:瀏覽器
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