egg 如何在响应请求后,继续执行?

如何在响应post请求后,服务端继续执行代码?

{
    id: 1
    data: 2
}

* abc(){
const ctx = this.ctx;
const result = yield this.ctx.service.bcd();
ctx.body = {result.data};

if(result.id){
todo....
}
}

这段代码会在执行完if后才发送body的响应内容

该怎么写让请求先被响应,然后继续执行if?

阅读 7k
5 个回答

为什么要这样操作呢,你后面的操作如果不成功会对之前的response有影响么,
如果你只是单纯的想在请求中"异步"执行一些操作,可以参考一下app.runInBackground

也可以使用child_process


* abc(){
const ctx = this.ctx;
const result = yield this.ctx.service.bcd();
ctx.body = {result.data};

process.nextTick(()=>{
if(result.id){
todo....
}
})
}

事件

const Emitter = require('events').EventEmitter
const emitter = new Emitter()

if(result._id) {
  emitter.emit('data', result._id)
}

ctx.body = { result.data }

在别的地方监听data事件

emitter.on(data', (data) => {
   todo....
})

我感觉中间件就是解决你这类问题的。
下面的代码是koa官方提供的中间件例子,next()之后的代码就会在请求返回后执行。

async function responseTime(ctx, next) {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
}

app.use(responseTime);

查看官方指南===>
https://github.com/koajs/koa/...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题