请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于async未涉及的问题提问

老师你好

我有一个疑问:async这个语法糖确实完美,很方便得让我们使用同步方法来写我们的小程序。但是promise不仅可以返回调用正常的情况(使用.then方法)又提供了如果返回结果失败的情况(使用.catch)

那么问题来了,async提供了关于返回结果失败的方法吗?参考promise的catch方法。

多谢老师的回答

正在回答

1回答

这个问题问得很好。

这个其实是程序设计的问题。在软件工程中,没有完美的解决方案,async/await 也是如此。

async/await 这个语法糖在业务开发中,唯一一个可能最会让人不适的一点就是关于异常处理的问题,因为他确实没有类似 .catch 的语法。在使用了async/await 语法之后,我们想处理可能存在的异常就只有使用 try/catch 这种处理方式,这种处理方式在绝大数业务功能开发的场景下都是没有问题的。因为在业务开发这种场景下,绝大多数产生的异常都是没办法怎么处理的,或者说不需要处理,我们可以让它继续向上抛,或者在 catch语句块里面集中处理掉。所以 async/await 有没有类似 .catch 的处理机制就显得不是那么的重要了,但有种场景是例外:

async run(){
   try{
        await funcA()
        await funcB()
        await funcC()
    }catch(e){
        console.log(e)
    }
}

比如这里我们调用了一个存在 3 个使用了 await 关键字修饰了的异步函数,同时里面都产生了异常,那么假如我们需要针对不同函数产生的异常进行差异化处理的话,这时候就麻烦了,因为区分不了。

这种代码逻辑一般出现在一些开源或者底层类库而不是业务功能里。在很多类库的源码实现里,如果涉及异步的话,清一色都是使用 promise 的各种 API 而不是使用 async/await,这里并不是async/await不好,而是它不擅长处理这种场景问题。所以在课程中,我提醒过同学们,虽然 async/await 很好,但是依然还是需要学习回调函数和 promise,这里除了出于基本功的考虑以外,还有一点就是在某些场景下,它们之间是没有互相可替代性的,该用回调函数还是得用,该用 promise也一样。只不过对于业务功能开发这种场景来说,async/await是我们处理异步调用的优先选择而已。

0 回复 有任何疑惑可以回复我~
  • 提问者 精慕门0241520 #1
    非常感谢老师的详细和认真回复,感受到了慕课网老师的专业。感觉在实践中catch遇到的很多都是网络问题和服务器问题,提醒用户服务器问题或者说甩锅给网络;),可以让用户焦急的心得到一点安慰,也算是用户友好吧。
    回复 有任何疑惑可以回复我~ 2022-04-10 22:58:11
  • 沁尘 回复 提问者 精慕门0241520 #2
    感谢同学的认可。的确,我们平时在使用各种应用的时候,你看到的那些很模糊的提示基本上 99%都是 catch 统一处理的,因为没办法怎么针对性处理,此时能做的就是记录下日志而已,然后事后尝试修复问题。不过这里还要补充说明一点就是,异常其实是一个语言无关的软件设计,这里面是蕴含软件工程设计思想的。一个异常要不要处理,怎么处理,什么时候处理都是有讲究的;另外,我们作为软件的开发者,还会主动地让程序出现异常,这是一种控制代码执行逻辑的技巧,在后续的课程章节中会有这块的应用,同学可以自行体会。
    回复 有任何疑惑可以回复我~ 2022-04-10 23:10:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信