2

我想解决一个承诺,然后在 Koa 2 中呈现这样的视图。

async function render(ctx, next) {
  // wait for some async action to finish
  await new Promise((resolve) => { 
   setTimeout(resolve, 5000)
  })
  // then, send response
  ctx.type = 'text/html'
  ctx.body = 'some response'
  await next()
}

但是,当我这样做时,服务器不会发送任何响应(浏览器一直在等待响应,然后超时)。我究竟做错了什么?

4

3 回答 3

8

我意识到我在这里迟到了几个月,但我刚刚偶然发现了同样的问题,并发现为了让给定的中间件能够等待异步执行,所有前面的中间件都必须await next(),而不是只是next()。确保验证这一点,事后看来是显而易见的。

我希望这有帮助。

于 2017-03-24T02:32:48.833 回答
1

所以,我拿了你的代码并创建了一个小应用程序:

const Koa = require('koa');
const app = new Koa();

async function render(ctx, next) {
  // wait for some async action to finish
  await new Promise((resolve) => { 
   setTimeout(resolve, 5000)
  })
  // then, send response
  ctx.type = 'text/html'
  ctx.body = 'some response'
  await next()
}

app.use(render);

app.listen(3000);

这种方式开箱即用......无需更改。所以看起来,你“使用”你的render功能的方式在某种程度上是不正确的。

于 2017-03-11T08:29:02.140 回答
0

我编写中间件的方式与@Sebastian 非常相似:

const Koa = require('koa');
const app = new Koa();

const render = async(ctx, next) {
    // wait for some async action to finish
    await new Promise((resolve) => { 
        setTimeout(resolve, 5000)
    });
    // then, send response
    ctx.type = 'text/html';
    ctx.body = 'some response';

    await next();
}

app.use(render);
....

希望对你有帮助

于 2017-06-20T14:04:13.510 回答