Javascript 由膝关节炎发送的响应后运行代码
为了优化响应延迟,有必要在将are响应发送回客户端后执行工作。但是,在发送响应后,我似乎可以让代码运行的唯一方法是使用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
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()
发送/刷新响应,然后继续工作。@Bergiresponse.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';
};