比如处理某一个请求,假设响应时间超过1s了,我就想在页面里显示timeout:
var app = require('koa')();
app.use(function *(next) {
var start = new Date();
yield next;
});
app.use(function *(next) {
var result = yield loadData();
this.body = result;
});
app.listen(8080);
比如这么一段简单的代码,loadData
假设超过1s没有结果返回我就认为是超时,想this.body = timeout
。这种怎么写呢?setTimeout应该是无法完成这个要求的吧
这样呢 app.use(function*(next){ this.timeout = setTimeout(function(){ this.body = ‘timeout’; }.bind(this),1000); yield next; }); 返回前将this.timeout=null;
setTimeout真心没用的。。。
koa-timeout
@joesonw 多谢~我去试试
另外不说koa,node本身对请求的超时响应是怎么处理的呢?我看req和res都有setTimeout方法,但写了点代码,貌似没效果,正确的使用姿势 = ?
@hwoarangzk 你看koa-timeout的源码。一个数据库操作,和一个setTimeout同时进行。如果setTimeout先运行,说明超时,如果不超时,则解除setTimeout
@joesonw 嗯,刚刚用了koa-timeout,确实能满足我的需求。但是我想,比如遇到一个req超时后,想页面显示一个固定的出错信息,同时终止这次超时请求的后续处理,应该怎么做到呢?
@hwoarangzk 你看example,就是这样的啊。因为超时了会throw error,会回到最上面一层的middleware。后面的不会执行。
如果对于线程阻塞的操作,这个就没法触发那个setTimeout啊