学习过程中只会使用,不太了解这些个的区别,学习了解下:
首先说说两者的概念:
-
Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,简单地说,Promise好比容器,里面存放着一些未来才会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的 -
async await
async await也是异步编程的一种解决方案,他遵循的是Generator 函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。
两者的区别
-
Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。
-
async await与Promise一样,是非阻塞的。
-
async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。
简单来看,这两者除了语法糖不一样外,他们解决的问题、达到的效果是大同小异的,我们可以在不同的应用场景,根据自己的喜好来选择使用。
// promise方法
let p1 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是p1')
},4000)
})
let p2 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是p2')
},200)
})
let p3 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是p3')
},200)
})
// 想让p1完成后再执行P2再执行P3
// 数量太多只能这么写
p1.then((res) => {
console.log(res);
p2.then((res) => {
console.log(res);
p3.then((res) => {
console.log(res);
})
})
})
//下面大神回答的挺好的
p1.then((res)=>{ console.log(res) return p2 })
.then((res)=>{ console.log(res) return p3 })
.then((res)=>{ console.log(res) })
// async await语法糖
let a1=()=>{
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是a1')
},4000)
})
}
let a2=()=>{
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是a2')
},40)
})
}
let a3=()=>{
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve('我是a3')
},40)
})
}
// 想让a1完成后再执行a2再执行a3
//能避免回调
async function asy(){
await a1().then((res) => {console.log(res)});
await a2().then((res) => {console.log(res)});;
await a3().then((res) => {console.log(res)});;
}
asy();