es6将异步场景分为两个阶段和三种状态: 两个阶段: unsettled(未决) 和 settled(已决) 三种状态: pending(挂起)、resolved(完成)、rejected(失败)
当任务处于未决阶段时,它一定是pending挂起状态,表示任务从开始到拿到结果之间的过程。 当任务处于已决阶段时,它只能是resolved和rejected两种状态的一种。
针对resolved状态的后续处理,称之为thenable 针对rejected状态的后续处理,称之为catchable
var promise = new Promise((resolve,reject)=>{
//任务在未决状态的代码
//立即执行
console.log('开始一百米长跑')
setTimeout(()=>{
if(Math.random()<0.5) {
//失败:没跑完
//推向rejected
reject(new Error('失败'))
}else{
var rd = Math.floor(Math.random()*100);
//推向resolved
resolve(rd)
}
},1000)
})
当任务推向已决是的后续处理
promise.then(data=>{
console.log('成功'+data)
},err=>{
console.log('失败’,+err)
})
## 或
promise.then(data=>{
console.log('成功'+data)
}).catch(err=>{
console.log('失败’,+err)
})
注意细节
1、任务一旦进入已决后,所有企图改变任务状态的代码都将失效,但是非改变状态的代码会立即按顺序执行 2、当任务在未决状态时,代码报错时将直接把任务推向rejected 3、当任务在未决状态时,手动抛出错误,如 throw new Errow('错误'),任务将直接推向rejected