今天有同事问我如何在koa2中的controller中使用延迟执行的功能,他直接在controller中使用setTimeout,但是没效果。
错误的代码类似下面这样:
1 // 错误的方法 2 exports.test = async(ctx) => { 3 setTimeout(async function(){ 4 await ctx.render('home/test.njk'); 5 }, 2000); 6 };
问题在于,这里的controller会直接返回,并不会返回给客户端任何信息。因此请求这个接口的路由会返回404。
要真正做到在controller处理请求时延迟执行某些操作,需要实现一个delay函数,这个函数返回一个Promise,在这个Promise中调用setTimeout,像下面这样:
1 // 正确的实现 2 exports.test = async(ctx) => { 3 async function delay(time) { 4 return new Promise(function(resolve, reject) { 5 setTimeout(function(){ 6 resolve(); 7 }, time); 8 }); 9 }; 10 await delay(2000); 11 await ctx.render('home/test.njk'); 12 };
上面代码会在2000毫秒后再渲染模版并返回给客户端。