怎么等异步函数执行完再执行下一个函数

除了把下一个函数放到异步函数里,还有其他的方法吗

Promise async await 配合使用

function fun1() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(true)
    }, 2000)
  })
}
async function fun2() {
  await fun1()
  console.log("123213213213")
}
fun2()

我们用延迟模拟异步,问题所在就是异步令i加1没执行完输出发现只能为0


  let i = 0

  setTimeout(() => {
    i += 1
  },200)
 
  console.log(i) //0

使用Promise


  let i = 0

  new Promise((resolve, reject) => {
    setTimeout(() => {
      i += 1
      resolve()
    },200)

  }).then(() => {
    console.log(i) //1
  })

4种方式,思路都是执行完异步函数后再调用下一个函数。
1、回调函数,要执行的函数是异步函数的回调。
2、事件驱动模式,你要执行的函数定义一个事件监听,异步函数执行完之后,主动的触发这个监听。
3、观察者模式,或称之为发布/订阅,这个模式有多种实现,有一些实现好的插件可以使用,原理就是异步函数执行完之后向中心发个信号,要执行的函数订阅这个信号,这样就可以知道什么时候去执行。发布/订阅模式与事件驱动模式类似,但是要优于事件驱动模式。
4、Promises对象,Promises对象是CommonJS工作组提出的一种规范,每一个异步任务返回一个Promise对象,该对象有一个then方法,在then里面指定回调函数。这种方式是最好的,对应的功能也多。建议使用这种方式。
PS:这4种方式,其实都是用的定时器。


function syncMethod() {
    return new Promise((next) => {
        setTimeout(() => {
            next()
        }, 1500)
    })
}

// 方法一
function main() {
    syncMethod().then(() => {
        alert("异步方法执行完成");
    })
}

// 方法二,推荐,需要额外的babel
async function main() {
    await syncMethod()
    alert("异步方法执行完成")
}