Skip to content
登录后刷题更便捷

异步编程的实现方式?

难度:
相关资料:

回调函数

  • 优点:简单、容易理解
  • 缺点:不利于维护,代码耦合高

事件监听(采用时间驱动模式,取决于某个事件是否发生):

  • 优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数
  • 缺点:事件驱动型,流程不够清晰

发布/订阅(观察者模式)

  • 类似于事件监听,但是可以通过‘消息中心’,了解现在有多少发布者,多少订阅者

Promise 对象

  • 优点:可以利用 then 方法,进行链式写法;可以书写错误时的回调函数;
  • 缺点:编写和理解,相对比较难

Generator 函数

  • 优点:函数体内外的数据交换、错误处理机制
  • 缺点:流程管理不方便

async 函数

  • 优点:内置执行器、更好的语义、更广的适用性、返回的是 Promise、结构清晰。
  • 缺点:错误处理机制
回答:

js 中的异步机制可以分为以下几种:

第一种最常见的是使用回调函数的方式,使用回调函数的方式有一个缺点是,多个回调函数嵌套的时候会造成回调函数地狱,上下两层的回调函数间的代码耦合度太高,不利于代码的可维护。

第二种是 Promise 的方式,使用 Promise 的方式可以将嵌套的回调函数作为链式调用。但是使用这种方法,有时会造成多个 then 的链式调用,可能会造成代码的语义不够明确。

第三种是使用 generator 的方式,它可以在函数的执行过程中,将函数的执行权转移出去,在函数外部我们还可以将执行权转移回来。当我们遇到异步函数执行的时候,将函数执行权转移出去,当异步函数执行完毕的时候我们再将执行权给转移回来。因此我们在 generator 内部对于异步操作的方式,可以以同步的顺序来书写。使用这种方式我们需要考虑的问题是何时将函数的控制权转移回来,因此我们需要有一个自动执行 generator 的机制,比如说 co 模块等方式来实现 generator 的自动执行。

第四种是使用 async 函数的形式,async 函数是 generator 和 promise 实现的一个自动执行的语法糖,它内部自带执行器,当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise 对象,那么函数将会等待 promise 对象的状态变为 resolve 后再继续向下执行。因此我们可以将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动执行。

内容仅供参考,难免有不恰当的地方,如果有问题欢迎及时反馈
部分内容来自网络,如果不慎侵犯您的权益,请联系我们,以便及时删除侵权内容