课程章节介绍
同学们,今天我们来聊聊LDS电线适配器里的错误处理,这个知识点非常重要,但容易踩坑。我先问大家一个问题:你在JavaScript里处理错误,是不是习惯用try-catch把可能出错的代码包起来?没错,这是同步代码的好习惯。但在Lightning Web Components里,用LDS电线适配器的时候,这个try-catch就不一定管用了。
为什么呢?因为电线适配器的响应是异步的。你想象一下,我们给电线函数传个参数,它不会马上返回结果,而是在背后帮我们取数据,然后通过回调通知我们。所以,假设你在外面包个try-catch,代码执行到那里,try-catch就执行完了,可错误可能还没发生呢。错误是发生在后面回调里的,比如在setSYS回调里,或者在电线适配器自己的响应里。这时候外层的try-catch根本抓不到这些错误。
所以我们得记住一个原则:始终把try-catch放到回调里面去。具体来说,对于电线函数,我们推荐使用if (data) { ... } else if (error) { ... }这种分支来处理。在else if (error)这个分支,专门处理那些配置性的错误,比如网络不通、传给适配器的参数不对,这些错误电线适配器会直接给你一个error对象。而你拿到数据之后,在if (data)分支里,你可能会对数据做进一步处理,比如解析、转换,这些操作本身可能出错,那就在这个分支里面再用try-catch包一下,确保万无一失。
再来看这个错误对象长什么样。LDS电线适配器返回的错误,其实是模仿了浏览器原生的Fetch API的Response对象。所以它有status、body、ok和statusText这些属性。你拿到error手里,就可以根据status判断是400还是500,根据ok是不是false,等等。
不过body里的内容,它会根据你请求的东西不同而变化。比如你用UI API去读取数据,body往往是个数组;如果是写入操作,比如创建或更新,body可能是个对象,里面带着字段级的错误信息。如果你调用的是Apex方法,body就是Apex方法抛出的那个错误的body。要是纯粹的网络错误,可能就是个简单的对象。所以处理错误的时候,你得清楚自己调的是什么,才能正确地解析body。
还有一点,电线适配器在触发之前,data和error这两个变量都是undefined。所以我们在模板里绑定数据的时候,得多加小心,得先用if:true指令或者类似的判断,保证数据不是undefined才去访问它的属性,否则页面容易崩。
最后推荐一下,Salesforce提供的lwc-recipes项目里,有个ldsUtils模块,里面封装了不少可重用的错误处理工具。大家可以参考一下,能帮我们少写很多重复代码,也能让错误处理更规范。
总结一下,LDS电线适配器的错误处理,核心就是:别让外层的try-catch骗了你,把错误抓到回调里面来;用if (data)和else if (error)分类处理;搞懂error对象的结构;数据未定义时要保护模板。这样,你的组件就会更健壮,用户也不会看到莫名其妙的崩溃啦。好了,这就是今天的内容,大家消化一下,有问题随时提。
关键词
LWC
Lightning Web Components
Salesforce