使用try...catch捕获await的错误后async仍然返回状态为fulfilled的promise

使用try...catch捕获await的错误后async仍然返回状态为fulfilled的promise

https://img1.sycdn.imooc.com//climg/64241e5c09a0050c16050719.jpg


这里为什么会执行后续的console.log('success');

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
    </style>
</head>
<body>
    <script>
        const wait = (ms, error) => {
            return new Promise ((resolve, reject) => {
                setTimeout (() => {
                    if (!error){
                        resolve();
                    }else{
                        reject(error);
                    };
                }, ms);
            });
        };

        const cc = async () => {
            try {
                await wait(1000, '等待1s后出错了')
                await wait(2000, '等待2s后出错了');
            } catch (error) {
                console.log(error, 'try...catch');
            }
           
        };
        cc().then (() => {
            console.log('success');
        }, (err) => {
            console.log(err);
        });
    </script>
</body>
</html>


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,解答如下:

1、try catch处理的是wait函数,与async的自身的情况没有关系。

2、async自身是一个异步函数,当它内部没写return时,相当于return undefined:

https://img1.sycdn.imooc.com//climg/6424e8db097ec34508170316.jpg

如果async的返回值不是Promise对象,则返回值会被包裹一层Promise.resolve():

https://img1.sycdn.imooc.com//climg/6424e9270948394207140560.jpg

即会返回一个成功状态的Promise,返回值是undefined,所以控制台打印结果如下:

https://img1.sycdn.imooc.com//climg/6424e94609c10dce06270143.jpg

如下课程中讲过:

https://class.imooc.com/lesson/2387#mid=58206(4分钟左右)

先回顾一下。

3、从第2点可知,函数cc本身是异步的,它可以被then接收,并且它默认返回了成功状态的Promise,所以success可以被打印。

祝学习愉快!

  • 不是说只要任何一个await后面的promise对象失败,async函数返回的promise对象就会失败?

    2023-03-30 16:02:44
  • 从哪里看到的?可以具体说明一下,一些结论要在具体的代码语境中才成立。TKXZ的例子就不适用同学的说法。TKXZ的例子中,两个await后面的Promise对象都是失败的,但对于cc而言它执行的是then成功中的函数。


    2023-03-30 16:35:03
  • https://img1.sycdn.imooc.com//climg/64254aea09dfaa0906760221.jpg

    2023-03-30 16:40:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师