经验总结
如题,函数内部实现记得加try catch的具体意思是,在函数的实现流程中,最外层需要加个try catch并在catch中调用reject(err)接口,确定返回的promise是有回调的。本质需求是函数的所有分支的结束需要调用resolve或reject,确保你的promise是有回调的,否侧你是给自己或者团队成员挖坑了!
代码示例
//ts代码
public async fun() : Promise<any> {
return new Promise<any>( async(resolve, reject) => {
//最外层
try {
resolve("ok")
} catch (e) {
reject(e)
}
}
}
如下截图来自async/await ES6 Promise 的最佳实践(经验分享)
如果在微信小程序开发者工具的console中看 “Uncaught (in promise) thirdScriptError”
就意味着你们代码中或调用的接口(第三方SDK)使用Promise时没有使用try catch了
建议:有关Promise的最佳实践,推荐大家一起来学习我下面收集的文章(参考文档
经验来源
在修复使用SocketTask,弃用wx 后,测试同事反馈 SDK的某些接口在断网的时候调用没有返回值(没有相关的日志输出),然后自己去撸SDK的代码。由于之前也不是专门写JS代码的,同时对SDK的业务逻辑也不熟悉,所以还是采用了较低效的日志输出,去查排查问题的代码点。因为方法的内部流程中又调用了返回值是promise的接口,即promise是多层嵌套的 (这个当时头就大了,直觉告诉我,这不可能是最佳实践呀!)
在二分法的原侧下不断的加日志输出,最后定位到是嵌套的第二层promsie的函数内部没有加try catch,然后在断网的情况下,触发了逻辑上的异常,导致没有reject或resolve的回调。最终最外层的接口亦没有回调。
如下是网上有关嵌套promise的建议