reject(‘some string’)与reject(new Error(‘some string’))
reject如果用await不try…catch会让程序崩溃。
async handleBtnClick() {
function testPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// reject('promise reject error');
reject(new Error('promise reject new Error'));
}, 200);
});
}
const res = await testPromise();
console.log(res, 'after--------');
}
Note
- reject会让await程序中断,下边的console不会再执行,无论是reject(‘some string’)还是reject(new Error(‘some string’))
- 相比于reject(‘some string’),reject(new Error(‘some string’))会提示错误的位置。
处理reject导致await中断方案
async handleBtnClick() { function testPromise() { return new Promise((resolve, reject) => { setTimeout(() => { // reject('promise reject error'); reject(new Error('promise reject new Error')); }, 200); }); } // method1 .then // testPromise().then(() => {}); // method2 try...catch包裹await // try { // const res = await testPromise(); // } catch (error) { // console.log('catch error------', error); // } const res = await testPromise().catch((err) => { console.log('await catch-----', err); }); console.log('after--------'); },
method1 promise.then
用.then,promise.then错误发生在内部不会影响到外部,但promise.then还是会产生多层嵌套,相比于回调函数没有什么大的改进。
method2 try…catch 包裹await
每一个await都需要包裹一个四行的try…catch,繁琐low。
method3 用await.catch()
amaizing!居然还可以这样。看起来像是一个最终的解决方案。
摘取自这里
但这个错误被await后边的catch捕获了后边的逻辑照样执行…
如果第十行不用throw,则错误被第八行catch捕获,第九行,第十三行都会提示一个message
throw 击穿调用栈promise展示async function clickBtn() { function p() { return new Promise((rv, rj) => { rj(new Error('error')); }); } console.log('await before'); const res = await p().catch((err) => { message.error('hehe'); throw err; }); message.success('hehe'); console.log('after----'); }
- 相比于reject(‘some string’),reject(new Error(‘some string’))会提示错误的位置。