JS的异步机制分为以下几种

🌈 第一种是常见的回调函数的方式,但是使用这种方式有一个缺点就是 多个回调函数会造成回调地狱,上下两层函数间的代码耦合性太高,不利于代码维护
🌈 第二种是 promise 对象的方式,使用promise的方式可以将嵌套的回调函数以链式方式调用,但使用这种方式有时会造成多个 then 的链式调用,可能造成语义不明确
🌈 第三种是使用 generator 的方式 generator 它可以在函数的内部将函数的执行权转移出去,在函数的外部又可以将函数的执行权转移回来;所以,当我们遇到异步函数执行的时候,可以先将函数的执行权转移出去,当异步函数执行完毕后再将函数执行权转移回来;
因此在generator内部对异步的操作可以用同步的顺序来书写;使用generator函数的方式,
在使用generator的时候 我们需要考虑的一个问题是什么时候将函数的执行权转移回来,所以我们需要一个自动执行generator函数的机制,比如co模块等可以用来实现generator函数的自动执行
🌈 第四种是 使用async函数,它是一个promise + generator 实现的一个自动执行的语法糖, 它内部自带执行器,当函数内部执行到一个await语句时,如果语句返回的是一个promise对象,那么它会等待这个promise对象的状态变成resolve后再继续向下执行,所以使用这种方式,我们也可以将异步的逻辑用同步的方式来书写,并且这个函数是自动执行的

第一种是最常见的使用回调函数的方式,但使用这种方式有一个缺点就是,多个回调函数会造成回调地狱,上下两层函数间的代码耦合性太高,不利于代码维护

第一种是 使用promise的方式 ,使用promise的方式它可以将嵌套的回调函数以链式的形式调用,使用这种方式,有时会造成 多个then 链式, 可能会造成代码的语义不明确

第三中的使用generator的方式, generator函数它可以将函数的执行权转移出去,在函数的外部可以将函数的执行权转移回来,当我们遇到异步函数执行时,可以先将函数的执行权转移出去,异步函数执行完毕后,在将函数的执行权转移回来, 因此在generator内部 对异步操作可以用同步的顺序来书写,所以我们在使用generator函数的时候需要考虑一个问题,就是什么时候将函数的执行权转移回来,因此我们需要一个自动执行generator的机制,比如co模块就可以实现generator的自动执行

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