2016-12-23 48 views
0

我想做一个长池请求。所以我想接受一个请求并在一段延迟后发送回应。可能吗?Koa 2路由器如何进行长轮询请求

我试图使用异步/ AWAIT synax,但它不工作对我来说(我得到了客户端上的错误404)

非常感谢您的帮助。

这里是我的服务器

import 'babel-polyfill'; 
import Koa from 'koa'; 
import Router from "koa-router"; 

import fs from "fs"; 


const router = new Router(); 

const convert = require('koa-convert') 
const serve = require("koa-static"); 

const app = new Koa(); 


router 
    .get('/*', async function (ctx, next) { 



      ctx.response.type = 'text/html; charset=utf-8'; 

      /* await (() => { 
       setTimeout(() => {ctx.body = fs.readFileSync(__dirname + "/public/index.html")}, 1000) 
      })(); */ 

      //ctx.body = fs.readFileSync(__dirname + "/public/index.html"); 


    }) 

app.use(convert(serve(`${__dirname}/public`))) 
app.use(router.routes()).use(router.allowedMethods()); 

app.listen(3000);

回答

3

一般来说,是的。这个有可能。

代码中的问题是,await实际上是基于承诺。所以你的超时功能需要被封装成一个承诺。像这样的东西可以工作:

... 
function delayed(ctx, ms) { 
    return new Promise((resolve, reject) => { 
     setTimeout(function() { 
      ctx.body = fs.readFileSync(__dirname + "/public/index.html") 
      resolve(); 
     }, ms); 
    }) 
} 

router.get('/*', async function (ctx, next) { 
    ctx.response.type = 'text/html; charset=utf-8'; 
    await delayed(ctx, 1000); 
}) 
... 
+0

谢谢你塞巴斯蒂安。 – Velidan