es6异步处理模型 Promise初识

250 阅读1分钟

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