什么是promise?
promise 表示的是一个未来即将发生事情。它的构建形式为
new Promise(/**executor **/function(resolve,rejected){
//ajax
if(success){
resolve(successResult)
}else{
rejected(errorInfo)
}
})
当promise创建的时候就会立即executor,这时候promise处于pending状态
当某个异步操作成功执行后,通过调用resolve可以变更promise的状态为fulfilled。
当某个异步操作执行失败后,通过调用reject变更promise的状态为rejected。
这里的reject 和resolve 都是内置的函数,通过他们可以修改promise状态。如果不掉用则状态无法变更(处于pending状态)
当promise状态变更后又会触发其链式方法的调用。
new Promise(function(resolved,reject){
if(success)
resolved(222)
else
reject(333);
}).then((res)=>{console.log(res)}).catch(e=>{console.log(e)})
如上述代码所示:
当处于reject状态(reject方法被调用)catch方法会被调用,then方法(无则不会,
当resolve被调用则then方法会执行,而catch则不会。所以promise又有一种状态机的即视感。
这里要补充一下then 方法全部参数如下所示:
Promise.prototype.then(onFulfilled, onRejected)
所以如果你有传入onRejected参数,那么出现异常的时候then也会被执行,即OnRejected被调用。
promise状态变更详细状态如下所示:
await async 与promise 的应用
如下typescript代码所示,过去我们使用setTimeout做延时任务,其书写方式相对麻烦需要传入回调函数并出现多重嵌套。现在可以通过async await 以及promise 解决这个问题
async function timeout(time:Number) {
return new Promise(resolve => setTimeout(resolve, time));
}
try{
await timeout(5000);
}catch(error){
....
}
async表示一个异步方法,它必须返回promise,而await 表示等待promise状态发生变更后才继续执行后续语句(即变为rejected or fullfilled)。如果处于rejected则会抛出异常用catch块捕获,如果为fullfilled则正常执行。
参考: