Promise:
异步调用工具类,其作用是简化异步调用。每个 Promise 对象,有 pending、fulfilled、rejected 三种状态。Promise
构造函数,提供 resolve 和 reject 两个函数来修改Promise 对象的状态,resolve 可以将状态改为 fulfilled,而 reject
可以将状态改为 rejected。
<script> var data = ['001', '小明', '数学'] var score = 90 function afterResolve(data) { console.log('通过 ' + data[1]) } function afterReject(info) { console.log('不通过 ' + info.toString()) } var pms1 = 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) console.log('我可能在 afterResolve 和 afterReject 前执行') </script>
如上,要么 resolve 将状态改为 fulfilled 后,会自动执行 afterResolve,要么 reject 将状态改为 rejected 或者函数返回,状态也会是rejected,自动执行afterReject。这两个函数的执行都是由 Promise 对象 pms1 自行控制,编程者无法确定它何时执行,也即是异步执行的,所以这里极有可能输出
我可能在 afterResolve 和 afterReject 前执行 通过 小明
解决这个问题,可以使用 async、await 关键字,并对代码进行如下修改
<script> var data = ['001', '小明', '数学'] var score = 90 function afterResolve(data) { console.log('通过 ' + data[1]) } function afterReject(info) { console.log('不通过 ' + info.toString()) } 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()
getPromise() 函数返回 Promise 对象, await 等待 Promise 对象 处理完自己的全部逻辑后,才继续执行打印,输出
通过 小明 我等在 afterResolve 和 afterReject 后执行