Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
Promise 实例的 catch() 方法用于注册一个在 promise 被拒绝时调用的函数。它会立即返回一个等效的 Promise 对象,这可以允许你链式调用其他 promise 的方法。此方法是 Promise.prototype.then(undefined, onRejected) 的一种简写形式。
一个在此 Promise 对象被拒绝时异步执行的函数。它的返回值将成为 catch() 返回的 Promise 对象的兑现值。此函数被调用时将传入以下参数:
reasonPromise 对象的拒绝值。
返回一个新的 Promise,无论当前的 promise 状态如何,这个新的 promise 在返回时总是处于待定(pending)状态。如果调用了 onRejected,则返回的 promise 将根据此调用的返回值进行兑现,或者使用此调用引发的错误进行拒绝。如果当前的 promise 已兑现,则 onRejected 不会被调用,并且返回的 promise 具有相同的兑现值。
catch 方法用于在 Promise 链进行错误处理,因为它总是会返回一个 Promise,所以它可以和 then() 方法一样被链式调用。
如果一个 promise 被拒绝并且没有可调用的拒绝处理器(处理器可以是 Promise.prototype.then()、Promise.prototype.catch() 或 Promise.prototype.finally()),则拒绝事件由宿主环境来提供。在浏览器中,这将触发 unhandledrejection 事件。如果将一个处理器附加到一个已被拒绝,且已导致未处理的拒绝事件的 promise,将会触发 rejectionhandled 事件。
catch() 方法内部会调用当前 promise 对象的 then() 方法,并将 undefined 和 onRejected 作为参数传递给 then()。该调用的返回值直接被返回。如果你对这些方法进行封装,这一点是可以观察到的。
这意味着传入 undefined 仍然会导致返回的 promise 被拒绝,你必须传入一个函数来防止最终的 promise 被拒绝。
因为 catch() 只是单纯的调用了 then(),它支持子类化。
备注:下面的示例抛出了 Error 的实例。与同步的 throw 语句一样,这被认为是一种良好的实践;否则,执行捕获的部分将不得不对参数进行检查,以查看它是字符串还是错误,并且你可能会丢失有用的信息,例如堆栈跟踪。
大多数情况下,抛出错误会调用 catch() 方法:
在异步函数内部抛出的错误会像未捕获的错误一样:
在调用 resolve 之后抛出的错误会被忽略:
| ECMAScript® 2027 Language Specification # sec-promise.prototype.catch |
启用 JavaScript 以查看此浏览器兼容性表。