Javascript 由膝关节炎发送的响应后运行代码

Javascript 由膝关节炎发送的响应后运行代码,javascript,optimization,generator,ecmascript-6,koa,Javascript,Optimization,Generator,Ecmascript 6,Koa,为了优化响应延迟,有必要在将are响应发送回客户端后执行工作。但是,在发送响应后,我似乎可以让代码运行的唯一方法是使用setTimeout。有更好的办法吗?也许是在发送响应后插入代码的地方,或者是异步运行代码的地方 这里有一些代码 koa = require 'koa' router = require 'koa-router' app = koa() # routing app.use router app app .ge

为了优化响应延迟,有必要在将are响应发送回客户端后执行工作。但是,在发送响应后,我似乎可以让代码运行的唯一方法是使用
setTimeout
。有更好的办法吗?也许是在发送响应后插入代码的地方,或者是异步运行代码的地方

这里有一些代码

koa                  = require 'koa'
router               = require 'koa-router'

app = koa()

# routing
app.use router app

app
  .get '/mypath', (next) ->
    # ...
    console.log 'Sending response'

    yield next

    # send response???

    console.log 'Do some more work that the response shouldn\'t wait for'

我也有同样的问题

只有当所有中间件完成时,koa才会结束响应(在中,是响应中间件,它结束响应。)

但是,我们可以通过调用作为节点api的
response.end
函数来解决问题:

exports.endResponseEarly = function*(next){
    var res = this.res;
    var body = this.body;

    if(res && body){
        body = JSON.stringify(body);
        this.length = Buffer.byteLength(body);
        res.end(body);
    }

    yield* next;
};

不要调用
ctx.res.end()
,这是一种黑客行为,它绕过了koa的响应/中间件机制,这意味着您也可以使用express。 以下是正确的解决方案,我也将其发布到

app.use(函数*(下一步){
//执行下一个中间件
下一个屈服
//请注意,此承诺不会兑现,因此不会延迟响应
//这意味着该中间件将在异步操作完成之前返回
//因此,如果发生错误,您也不会得到500,因此最好手动记录。
db.queryAsync('INSERT-INTO-body(?),['body']).catch(console.log)
})
应用程序使用(函数*(){
this.body='Hello World'
})
不需要
ctx.end()

简言之,你要做什么

function *process(next) {
  yield next;
  processData(this.request.body);
}
不是


您可以使用
setTimeout
在异步任务中运行代码,如下所示:

 exports.invoke = function*() {
  setTimeout(function(){
    co(function*(){
      yield doSomeTask();
    });
  },100);
  this.body = 'ok';
};

您如何发送请求?这类事情通常会有
success
回调。请向我们展示您的代码。通常,您只需调用
response.end()
发送/刷新响应,然后继续工作。@Bergi
response.end()
未定义:。我使用
koa路由器
。我将添加一些代码。谢谢。但那不是咖啡脚本,不是ES6吗?ES6中的咖啡脚本。我只是忘了屈服。我会修好的。另外,koa不支持
response.end()
:我正在研究这个问题。不过,我不能完全肯定我是否明白你的答案。在发送响应后,哪一部分继续?循环中的下一个生成器?是的,下一个生成器将运行,因为
yield*next
下一个生成器似乎返回404。我猜是因为我的路由处理程序是堆栈中的最后一个。在将结果返回到客户端之后,我尝试将响应结果保存到本地缓存。我可以省略yield*下一步,将我的保存代码放在那里——但这并不意味着;他看起来不聪明。
function *process(next) {
  yield next;
  yield processData(this.request.body);
}
 exports.invoke = function*() {
  setTimeout(function(){
    co(function*(){
      yield doSomeTask();
    });
  },100);
  this.body = 'ok';
};