Promise.then()的两个参数是什么,分别是干什么的?第二个参数和catch的区别
发布时间
阅读量:
阅读量
在今天的面试中被询问了关于 Promise.then() 的两个参数及其作用。由于平时很少使用该方法,在学习过程中并未给予过多关注。因此,在之后的时间里我会 dedicatedly 学习并掌握这一知识点。
首页我们先要区分几个概念:
- reject用于触发错误并丢弃后续代码执行路径;而catch用于捕获错误并允许后续代码继续执行。
- reject作为Promises的一个方法被调用时会触发错误;另一方面,则有then和catch两个方法分别用于捕获成功结果或错误情况。
核心区别在于,在第一个函数内部触发了一个异常事件后,该事件无法被其后续定义的catch块捕捉到。此外,在处理异常时,默认情况下catch块遵循就近原则操作:如果两个catch块同时存在,则仅前一个catch块能够捕捉到该异常;若前一个catch块未被定义,则后一个catch块负责捕捉该异常。
const p = new Promise((resolve, reject)=>{
resolve() //抛出成功时的结果
})
p.then((res)=>{
throw new Error('hello');
}).then(()=>{},(err2)=>{
console.log(err2,'err2')
}).catch((err1)=>{
console.log(err1,'err1')
}) //图1第一行所示错误,err2会捕获到错误
p.then((res)=>{
throw new Error('hello');
}).catch((err1)=>{
console.log(err1,'err1')
}) //图1第二行所示错误,没有then,catch捕获异常

const p = new Promise((resolve, reject)=>{
reject('你错啦~~')
})
p.then((res)=>{
throw new Error('hello');
},(err2 => {
console.log(err2,'err2')
})).catch((err1)=>{
console.log(err1,'err1')
}) //图2第一行,then的第二个参数捕获异常
p.then((res)=>{
throw new Error('hello');
}).catch((err1)=>{
console.log(err1,'err1')
})// 图2第二行,catch捕获异常

建议一直用catch来捕获异常
原因在于catch能够捕获当then方法执行时可能出现的错误,并且这种处理方式更为贴近同步编程的习惯(try/catch)。因此,在设计同步流程时建议优先采用catch机制而非将then用于捕获异常的位置。
原因在于catch能够捕获当then方法执行时可能出现的错误,并且这种处理方式更为贴近同步编程的习惯(try/catch)。因此,在设计同步流程时建议优先采用catch机制而非将then用于捕获异常的位置。
// bad
promise
.then(function(data) {
// success
}, function(err) {
// error
});
// good
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
全部评论 (0)
还没有任何评论哟~
