网上没找到很有收获的文章, 所以自己总结了一下:
错误的抛出, 两种方法
reject()throw
两种方法效果基本是等同的, 区别在于 reject() 不会终止函数的执行.
只有最先抛出的错误会被捕获.
比如先 reject() 一个错误, 再 throw 第二个错误, 捕获到的是第一个错误, 但第二个抛出的错误也会被执行, 不过只有终止函数的作用了, 相当于 return.
网上有人建议不要使用 throw 抛出错误, 因为 throw 并不会更改 promise 的状态, 而且容易和系统抛出的其他异常混淆. 我认为这个建议值得继续探讨而不是下定论, 首先, promise 的状态并不能直接监控, 其次抛出什么错误我们完全可以扩展 Error 而区分错误类型.
我的建议是没有对错, 分具体情况使用就好.
reject() 的优点, 不影响函数继续执行, 没有 throw 的作用域限制.
throw 的优点, 不需要在 Promise 中, 在 then() 中的普通函数中也能抛出错误.
错误的捕获, 两种方法
Promise 内部抛出的错误是无法被外部的 try...catch 捕获的, 因为作用域问题.
then()的第二个参数catch()的第一个参数
错误的处理都是调用一个函数 (onRejected), 传入一个参数, 这个参数即为刚才抛出的错误.
错误只会被捕获一次. 且如果错误被捕获, 则之后的 then() 都会被执行, 即使不拥有正常的返回值作为参数. 因此建议链式调用最末端再捕获错误.
这两种方法没有什么区别, 无论是如何抛出错误, 都能被正常捕获.