async/await解析
发布网友
发布时间:2024-10-02 14:01
我来回答
共1个回答
热心网友
时间:2024-10-08 05:33
在先前的讨论中,我们探讨了Promise的使用。在本章中,我们将深入探讨另一种处理异步代码的技巧。
2016年,ES7引入了async/await语法。那么,这一新特性的出现是为了解决什么问题呢?在async/await出现之前,我们有三种不同的异步代码编写方式。
不过,这三种方法在编写时都不够优雅。因此,ES7进行了优化,并推出了async/await。相较于Promise对象的then函数嵌套以及使用Generator的繁琐(需要借助co库才能自动执行,否则需要手动调用next()),Async/Await允许我们以同步代码的风格轻松编写异步代码,同时保持异步机制。这使得代码更加简洁,逻辑更加清晰。
async/await的特点包括:
1. async/await具有更高的语义性,"async"代表异步,用于声明一个异步的function;"await"可以视为"async wait"的缩写,用于等待异步方法执行完成;2. async/await是一种使用同步思维来解决异步问题的方案(等待结果出现后,代码才会继续执行);3. 可以通过多层async function的同步写法来替代传统的callback嵌套。
关于async function语法和await语法的具体使用方式,这里不做详细展开。
在使用async函数时,无论是Promise reject的数据还是逻辑错误,都会被默默地吞掉。因此,最好将await放入try{}catch{}中,以便catch能够捕捉到Promise对象rejected的数据或者抛出的异常。
如果不使用try/catch,也可以像以下示例那样处理错误(因为async函数执行后会返回一个promise)。
如果你不想让错误中断后面代码的执行,可以提前截留住错误,如下所示。
async/await的使用场景之一是,对于多个await命令的异步操作,如果它们之间不存在依赖关系(后面的await不依赖前一个await返回的结果),可以使用Promise.all()让它们同时触发。
例如,exc1的两个并列await命令的写法可能会比较耗时,因为只有test1执行完毕后,test2才会执行。你可以在浏览器的Console中尝试一下,会发现exc2使用Promise.all执行得更快一些。
关于async/await的兼容性问题,你可以在自己的项目中直接使用,或者通过babel来使用。只需将presets设置为stage-3即可。