场景:最近在做表单验证 发现了很多的form表单验证的时候很多都是采用的异步捕获?我依稀记得try catch 是捕获同步代码的错误机制,为什么可以捕获到异步的操作;以下是截取antDesign一段伪代码:
可以参考 下方的伪代码:
const result = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('我是错误')
}, 1000)
})
}
async function foo () {
try{
const m = await result()
}catch(error){
console.log(error,'9999')
}
};
foo()
问题:为什么可以捕获?这其中的原理是什么?是否只要带上await 的语法糖都是用try catch 进行捕获?
try catch
能捕获async
函数中await的异步异常,是基于类es6generator
生成器函数的调度机制。除开async await是一些现代浏览器或者高版本node已经原生支持的不说。可以通过babel 将async await 编译成es5来透析它的ployfill实现。generator主要是两种调度类型,
next
跟throw
generator上有一个throw就是原声的throw方法eg. 在https://babeljs.io/repl将以下代码转换,然后自行断点调试