前言
在使用koa2中处理路由时涉及到一些异步操作的困惑,有时候路由处理程序继续执行而不等待函数行为完成,这样会导致无法正常处理异步结果,因而路由会 404 Not Found
接下来会用一个例子记录一些对于异步的处理
正文
const Koa = require('koa');
const app = new Koa();
// 模拟一个异步操作,比如读取文件
function simulateAsyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 模拟异步操作,返回一个字符串
resolve('Async operation result');
}, 1000);
});
}
// 不使用await处理异步操作
app.use(async (ctx) => {
// 没有使用 await,不等待继续执行,会导致结果是一个 Promise 对象
// 读取文件的操作还未执行完毕,ctx.body 就已经被赋值了
const result = simulateAsyncOperation();
ctx.body = result;
});
// 使用 await 来等待异步操作
app.use(async (ctx) => {
const result = await simulateAsyncOperation();
ctx.body = result; // 现在 result 将是实际的字符串
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在本例中,对于一个需要等待处理的事件我们用计时器代替,在等待一秒钟后执行,在处理这个异步操作时如果不使用async/await
会导致程序一直往后执行而忽略执行simulateAsyncOperation()
。
参考资料
[理解 JavaScript 的 async/await - 知乎 (zhihu.com)]