除了把下一个函数放到异步函数里,还有其他的方法吗
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("异步方法执行完成")
}