Promise、async、await 同步等待
Promise 是异步调用工具类,其目的是简化异步调用,使异步调用和同步调用一样简单,其调用逻辑图如下

每个 Promise 对象有 pending、fulfilled、rejected 三种状态。Promise 构造函数,提供 resolve 和 reject 两个函数来修改Promise 对象状态。
对象构造初始状态为 pending,调用 resolve 函数后,状态改为 fulfilled,而调用 reject 函数,状态改为 rejected。示例如下:
<script>
function afterResolve(data) {
console.log('通过')
}
function afterReject(info) {
console.log('不通过')
}
new Promise((resolve, reject) => {
var score = 90
if (score >= 60) {
resolve(data)
} else if (0 <= score && score < 60) {
reject(new Date())
} else {
throw 'score exception'
}
})
.then(afterResolve)
.catch(afterReject)
console.log('我可能在 afterResolve 和 afterReject 前执行')
</script>
结果如下:
我可能在 afterResolve 和 afterReject 前执行 通过 小明z
这里 console.log('我可能在 afterResolve 和 afterReject 前执行') 先执行,这是因为 Promise 是异步调用,有延迟。为了达到同步效果,可以使用 async、await 关键字,
并对代码进行如下修改
function afterResolve(data) {
console.log('通过 ')
}
function afterReject(info) {
console.log('不通过 ')
}
function getPromise() {
return new Promise((resolve, reject) => {
if (score >= 60) {
resolve(data)
} else if (0 <= score && score < 60) {
reject(new Date())
} else {
throw 'score exception'
}
})
.then(afterResolve)
.catch(afterReject)
}
async function testAwait() {
await getPromise()
console.log('我等在 afterResolve 和 afterReject 后执行')
}
testAwait()
await 需要和 async 共同使用,不可单独使用。 await 会等待 Promise 对象执行完,再继续执行。getPromise() 函数返回 Promise 对象, await 等待 Promise 对象处理完全部逻辑后,才继续执行打印,输出
通过 小明 我等在 afterResolve 和 afterReject 后执行
promise 支持链式调用,链式调用可以简化同步逻辑,不必使用 async 和 await
<script>
// 构造 Promise
var p1 = new Promise((resolve, reject) => {
var score = 50
if (score >= 60) {
resolve('通过')
} else {
reject('拒绝')
}
})
// 由于 score = 50,p1 状态变为 rejected
// 抛出异常
var p2 = p1.then(
function (data) {
return Promise.resolve('p1 fulfilled ' + data)
},
function (data) {
throw new Error('p1 rejected ' + data)
}
)
// 输出 p2 rejected Error: p1 rejected 拒绝
// “Error: p1 rejected 拒绝” 是 p1.then 抛出的异常
var p3 = p2.then(
function (data) {
console.log('p2 fulfilled ' + data)
},
function (data) {
console.log('p2 rejected ' + data)
}
)
// p2.then 没有抛出异常,也没有参数下传
// 故输出 p3 fulfilled undefined
var p4 = p3.then(
function (data) {
console.log('p3 fulfilled ' + data)
},
function (data) {
console.log('p3 rejected ' + data)
}
)
console.log('主流程走完')
</script>
利用 async 和 await 等待一段时间:
<script type="text/javascript">
function doWait(waitTime) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('finish')
}, waitTime)
})
}
async function wait(waitTime) {
var promiseInfo = await doWait(waitTime)
console.log('after wait') // 这行代码,需要等待 waitTime 时间后,才能执行
}
wait(5000)
</script>
浙公网安备 33010602011771号