Promise

78 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

1.Promise是什么?

1. 抽象的说是js中进行异步编程的新的解决方案(旧的是谁?-->纯回调)
2.具体描述:
    (1)从语法上来说:Promise是一个构造函数
    (2)从功能上来说:Promise对象用来封装一个异步操作并可以获取其结果

2.Promise状态

1.pendding变为fulfilled
2.pendding变为rejected
说明:只有这两种,且一个promise对象只能改变一次
    无论变为成功或者失败,都会有一个结果数据
    成功的结果数据一般成为value,失败的结果数据一般成为reason

3.Promise的基本使用

//创建一个promsie对象
const p = new Promise((resolve,reject)=>{ //new promise时会有一个执行器executor
    //执行异步操作
    setTimeout(()=>{
        const time = Date.now() //如果当前时间是偶数就代表成功,否则就是失败
        if(time%2 == 0){
            resolve('成功的数据,time=' + time)
        }else{
            reject('失败的数据,time=' + time)
        }
        
    },1000)
})

p.then(
    value => {  //接收得到成功的value数据
        console.log('成功的onResolved',value);
    },
    reason => { //接收得到失败的reason数据
         console.log('失败的onRejected',reason);
    }
)

4.为什么要用Promise?

1.指定回调函数的方式更加灵活:
    旧的:必须在启动异步任务前指定回调函数
    promise:回调函数一般在启动异步任务之后(也可在异步任务完成之后)
    
2. 支持链式调用,可以解决回调地域问题   
    什么是回调地狱?回调函数嵌套调用,外部回调函数异步执行的结果
    是嵌套的回调函数执行的条件
    回调地狱的缺点:不便于阅读、不便于异常处理
    解决方案:promise链式调用(还有回调函数)
    终极解决方案:async/await
    
    
    2.1回调地狱(纯回调产生的)
        doSomething(function(result){
            doSomethingElse(result,function(newResult){
                doThirdThing(newResult,function(finaResult){
                    console.log('打印结果: + finaResult)
                },failureCallback)
            },failureCallback)
        },failureCallback)
        
        异常处理每个都需要分别去做
        
        
    2.2使用promise的链式调用解决回调地狱
        doSomething().then(function(result){
            return doSomethingElse(result) //此处会返回一个新的promise
        })
        .then(function(newResult){
            return doThThing(newResult)
        })
        .then(function(finaResult){
            console.log('打印结果:' + finaResult)
        })
        .catch(failureCallback)

5.promise 语法

1.Promise.all()
//返回一个新的promise对象,只有所有的都成功才叫成功,只要有一个失败了就直接失败

2.Promise.allSettled()
3.Promise.any()
4.Promise.prototype.catch()
5.Promise.prototype.finally()
6.Promise.race()
//返回一个新的promise对象,第一个完成的promise结果状态就是最终的状态

7.Promise.reject() //返回成功的promise对象

8.Promise.resolve() //返回失败的promise对象
9.Promise.prototype.then()

6. promise的几个关键问题

1. 如何改变promise的状态
    (1)调用resolve(value):如果当前是pendding就会变为resolved
    (2)调用reject(reason):如果当前是pendding就会变为rejected
    (3)抛出异常:如果当前是pendding就会变为rejected