Appearance
catch
本节目标:理解“catch”的核心思路,并能把它用于实际开发或面试表达。 一般总是建议,Promise 对象后面要跟catch方法,这样可以处理 Promise 内部发生的错误。
**返回值**
catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法和catch回调方法。如果catch方法中未抛出错误或reject,则catch返回的promise实例的成功回调会执行,反之会执行错误回调函数。同时,catch回调函数的返回值会被resolve包装成“兑现”状态的值。
`const` `someAsyncThing` `=` `function` `()` `{`
`return` `new`Promise(function
(resolve,
reject)
`{`
`//` 下面一行会报错,因为`x`没有声明resolve(x
`+`2);
}); }; someAsyncThing()
.catch(function
(error)
`{`console.log('oh
no',
error);
`})`.then(function
`()` `{`console.log('carry
on');
`});`
`//` `oh` `no` `[ReferenceError:` `x` `is` `not` `defined]`
`//` `carry` `on`
上面代码运行完catch方法指定的回调函数,会接着运行后面那个then方法指定的回调函数。跳过执行 catch方法只会捕获前面Promise和then的报错,如果前面的Promise没有报错,则会跳过。 Promise.resolve()
.catch(function
(error)
`{`console.log('oh
no',
error);
`})`.then(function
`()` `{`console.log('carry
on');
}); // carry on 上面的代码因为没有报错,跳过了catch方法,直接执行后面的then方法。此时,要是then方法里面报错,就与前面的catch无关了。
**catch****方法之中,还能再抛出错误。**
`const` `someAsyncThing` `=` `function` `()` `{`
`return` `new`Promise(function
(resolve,
reject)
`{`
`//` 下面一行会报错,因为`x`没有声明resolve(x
`+`2);
}); }; someAsyncThing().then(function
`()` `{`
`return`someOtherAsyncThing(); }).catch(function
(error)
`{`console.log('oh
no',
error);
`//` 下面一行会报错,因为 `y` 没有声明
`y` `+`2; }).then(function
`()` `{`console.log('carry
on'); }); // oh no [ReferenceError: x is not defined] 上面代码中,catch方法抛出一个错误,因为后面没有别的catch方法了,导致这个错误不会被捕获,也不会传递到外层。如果改写一下,结果就不一样了。 someAsyncThing().then(function
`()` `{`
`return`someOtherAsyncThing(); }).catch(function
(error)
`{`console.log('oh
no',
error);
`//` 下面一行会报错,因为`y`没有声明
`y` `+`2; }).catch(function
(error)
`{`console.log('carry
on',
error); }); //
`oh` `no` `[ReferenceError:` `x` `is` `not`defined] // carry on [ReferenceError: y is not defined] 上面代码中,第二个catch方法用来捕获前一个catch方法抛出的错误。
