Promise基本概念

347 阅读3分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。

1、promise概述?

1-1、什么是promise

Promise 是一个对象,它代表了一个异步操作的最终完成或者失败 ------MDN

Promise代表了未来将要发生的事件,用来传递异步操作的消息

  • 抽象表达:Promise是JS中进行异步编程的新的解决方案(旧:纯回调)

  • 具体表达:

    语法上:Promise是一个构造函数

    功能上:Promise对象用来封装一个异步操作并或取其结果

1-2、promise的状态及状态改变

promise的三种状态

  • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。

  • 已兑现(fulfilled): 意味着操作成功完成。

  • 已拒绝(rejected): 意味着操作失败。 promise的状态改变:

  •   pending -> resolve方法 -> fulfilled

  •   pending -> reject方法 -> rejected

注意:只有这两种状态改变,且一个Promise对象的状态只能改变一次,一旦状态改变,就不会再变

2、promise的基本运行流程

clipboard.png

3、promise的基本使用

// 1、创建Promise对象 
const p=new Promise((resolve,reject)=>{ //执行器函数 同步回调 
// 2、执行异步操作任务 
    setTimeout(()=>{ 
        const time=Date.now() 
        if(time%2==0){ //当前时间偶数-成功 
            // 成功时调用resolve()
            resolve('成功的数据,time='+time) 
        }else{ 
            // 失败时调用reject()
            reject('失败的数据,time='+time) } 
        },1000) 
 })
 p.then( 
        value=>{ //接收成功时得到的value数据onResolved() 
            console.log(value)
        },
        reason=>{ //接收失败时得到的reason数据 onRejected() 
            console.log(reason)
        }
    )
    //异步任务结束后在指定回调函数,回调函数同样可以得到结果 
    setTimeout(()=>{ 
            p.then( 
                value=>{ //接收成功时得到的value数据 onResolved()
                    console.log(value)
                },
                reason=>{ //接收失败时得到的reason数据 onRejected()
                    console.log(reason) 
                }
            ) 
    },2000)

4、为什么要用promise?


4-1、使用Promise的优点

  • 指定回调函数方式更加灵活(指定时间不受限制)

    纯回调:必须在启动异步任务前指定

    promise:启动异步任务---》返回Promise对象---》给promise绑定回调函数(甚至可以在异步任务结束后绑定回调函数)

    // 成功的回调函数
    function successCallback(result){ 
        console.log('创建成功:'+result)
    } 
    // 失败的回调函数 
    function failCallback(error){ 
        console.log('创建失败:'+error) 
    } 
    
    // 使用纯回调函数---必须在异步任务启动前指定回调函数  
    createFileAsync(fileSettings,successCallback,failCallback) 
                
    // 使用Promise 
    const promise=createFileAsync(fileSettings)
    setTimeout(()=>{
         promise.then(successCallback,failCallback)
    },3000)
  • 支持链式调用,可解决回调地狱问题

    回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件

    回调地狱缺点:不便于阅读/不便于异常处理

// 回调地狱 
doSomething(function(result){ 
        doSomethingElse(result,function(newResult){ 
            doThirdThing(newResult,function(finalResult){
                console.log('Got the final result:',finalResult)
            },failCallback) 
        },failCallback)
},failCallback)

解决方案:promise链式调用

// 使用promise的链式调用解决地狱回调
doSomething() 
.then(function(result){
    return doSomethingElse(result)
})
.then(function(newResult){ 
    return doThirdThing(newResult) 
}) 
.then(function(finalResult){ 
    console.log('Got the final result:',finalResult)
}) 
.catch(failCallback) //异常传透,三个函数的错误都传到failCallback

最终解决方案:async/await

// async/await:回调地狱终极解决方案 
async function request(){ 
    try{ 
        const result = await doSomething() 
        const newResult = await doSomethingElse(result)
        const finalResult = await doThirdThing(newResult)
        console.log('Got the final result:',finalResult) 
        }catch(error){
            failCallback(error)
        }
 }

4-2、promise的缺点

  1. 无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
  2. 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
  3. 当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。