网上没找到很有收获的文章, 所以自己总结了一下:
reject()
throw
两种方法效果基本是等同的, 区别在于 reject() 不会终止函数的执行.
只有最先抛出的错误会被捕获.
比如先 reject()
一个错误, 再 throw
第二个错误, 捕获到的是第一个错误, 但第二个抛出的错误也会被执行, 不过只有终止函数的作用了, 相当于 return
.
网上有人建议不要使用 throw
抛出错误, 因为 throw 并不会更改 promise 的状态, 而且容易和系统抛出的其他异常混淆. 我认为这个建议值得继续探讨而不是下定论, 首先, promise 的状态并不能直接监控, 其次抛出什么错误我们完全可以扩展 Error 而区分错误类型.
我的建议是没有对错, 分具体情况使用就好.
reject()
的优点, 不影响函数继续执行, 没有 throw
的作用域限制.
throw
的优点, 不需要在 Promise 中, 在 then()
中的普通函数中也能抛出错误.
Promise 内部抛出的错误是无法被外部的 try...catch 捕获的, 因为作用域问题.
then()
的第二个参数catch()
的第一个参数错误的处理都是调用一个函数 (onRejected), 传入一个参数, 这个参数即为刚才抛出的错误.
错误只会被捕获一次. 且如果错误被捕获, 则之后的 then()
都会被执行, 即使不拥有正常的返回值作为参数. 因此建议链式调用最末端再捕获错误.
这两种方法没有什么区别, 无论是如何抛出错误, 都能被正常捕获.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.