关于async未涉及的问题提问
来源:5-6 告别回调地狱——async、await与同步、异步编程(下)

精慕门0241520
2022-04-10
老师你好
我有一个疑问: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是我们处理异步调用的优先选择而已。
022022-04-10
相似问题