前言

在使用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)]
最后修改:2023 年 11 月 07 日
如果觉得我的文章对你有用,请随意赞赏