百科问答小站 logo
百科问答小站 font logo



为什么try catch能捕捉await后promise错误? 和执行栈有关系吗? 第1页

  

user avatar   catchen 网友的相关建议: 
      

因为这是 await 的功能的一部分,而且必须设计成这样。

没有 await 时,你的表达式返回一个 Promise,然后代码就继续往前执行了,不会等这个 Promise resolve 或 reject。有了 await 之后,代码不会立即继续往前执行,而是停下来等 Promise 的返回值,有返回值才能继续往前执行。

Promise 有返回值的本质是什么?是 Promise resolve 了。所以 await 可以简单理解为把 await 之后的代码放进了这个 Promise 的 then 里面,这是大多数人可以理解的。

很多人没有意识到的是,这个设计还必须考虑 Promise reject 了该怎么办。还继续往前执行吗?这样设计显然有问题,因为代码无法区分 resolve 和 reject。那如何才能让 await 之后的代码区分出到底 Promise 是 resolve 了还是 reject 了呢?最符合直觉的设计是把 reject 看作 throw,把 reject 传递的值用作 throw 表达式需要的值。

这种直观的设计使得 await 表达式跟没有 await 一样,成功了就继续往前执行,出错了就 throw 然后外面可以 catch。

当然,实际发生的事情并不是这么简单,因为 await 只能用在 async 函数里面,async 函数本质是返回一个 Promise,所以如果 await 进行了 throw,没有 catch 的话 throw 出来的东西就变成 async 函数层面的 reject。如果 catch 了呢?你可以把整个 try-catch 表达式看作另外一层 await,如果 catch 了那 try-catch 后面的代码就继续往前执行。




  

相关话题

  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 
  JS和Scheme对闭包变量的绑定能力差异,哪种更合理? 
  2018年一个合格的前端应该是什么样的? 
  计算机专业的学生如何系统的学习前端技术? 
  为什么有的高级程序员很讨厌甚至禁止使用 setTimeout? 
  避免使用 eval、new Function 的方法可以降低 XSS 攻击的风险吗?为什么? 
  高级前端工程师是什么样子的,有多厉害?他们的职业规划是怎样的? 
  如果工作一年经验的前端开发人员比工作两年的功能测试人员工资低,你还愿意待在那家公司吗? 
  JavaScript能否能实现所有函数调用时的钩子函数? 
  JavaScript能否能实现所有函数调用时的钩子函数? 

前一个讨论
普通程序员,是Google 的待遇好,还是Facebook 的待遇好呢?
下一个讨论
烤箱和空气炸锅做出来的食物有什么区别?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利