今天有同事問我如何在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毫秒后再渲染模版並返回給客戶端。