理解Koa2中的async&await的用法

2020-06-17 07:19:14易采站长站整理

}
}
}
}

有了以上基础,我们再来看一下之前的问题,为什么response没有等到第二个middleware执行完成就立即返回了呢?

因为第一个middleware并不是一个异步函数啊。

由于每次next方法的执行,实际上都是返回了一个Promise对象,所以如果我们在某个middleware中执行了异步操作,要想等待其完成,就要在执行这个middleware之前添加await

那我们来改写一下之前的代码


app.use(async (ctx, next) => {
console.log(`${ctx.method}:::${ctx.url}`)
await next()
})

app.use(async ctx => {
const result = await doSomething(3000)
console.log(result);
ctx.body = result
})

好了,没有问题,一切如期望执行:clap:

错误处理

借助了Promise强大的功力,配合async/await语法,我们只需要把try/catch的操作写在最外层的middleware中,就可以捕获到之后所有中间件的异常!


app.use(async (ctx, next) => {
try{
await next()
}catch(err){
console.log(err)
}
})

app.use(async (ctx)=>{
throw new Error('something wrong!')
ctx.body = 'Hello'
})

基于中间件链的完全控制,并且基于 Promise 的事实使得一切都变得容易操作起来。不再是到处的 if (err) return next(err) 而只有 promise