Promise浅析

104 阅读2分钟

1、promise是什么

1.1 Promise的理解

  • 抽象表达:Promise是JS中进行异步编程的解决方案。(以前使用纯回调解决)
  • 具体表达:
    (1). 从语法上来说:Promise是一个构造函数;
    (2).从功能上来说Promise对象用来封装一个异步操作并可以获取结果。

1.2 Promise的状态改变

(1). pending变为resolved
(2). pending变为rejected
说明:只有这两种变化,且一个Promise对象只能变一次
无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason

1.3 Promise的基本用法

//1.创建一个新的promise对象
const p = new Promise((resolve,reject)=>{//执行器函数
//2.执行异步操作任务
setTimeout(()=>{
    const time = Date.now()
//3.1如果成功了,调用resolve(value)
if (time %2 ==0){
    resolve('成功的数据,time='+time)
}else{
//3.2如果失败了,调用reject(reason)
reject('失败的数据,time'+time)
}
},1000);

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

简单来说:
1、创建一个Promise对象
2、执行异步操作任务
3、如果任务成功就调用resolve(value),如果失败则调用reject(reason)
4、通过.then来接收成功的value或失败的reason

2、 为什么要用Promise

  1. 指定回调函数的方式更加灵活
  • 旧方案:必须在启动异步任务前指定回调函数
  • Promise:启动异步任务=>返回Promise对象=>给Promise对象绑定回调函数,甚至可以在异步任务结束后指定回调函数。
  1. Promise支持链式调用,可以解决回调地狱
  • 什么是回调地狱?回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件,即第二个if任务是以第一个if任务成功为前提,第三个if是以第二个成功为前提。

  • 回调地狱的缺点?不便于阅读,不便于异常处理

  • 使用Promide链式调用可以有效解决回调地狱,但终极解决方案是async/await

后面再整理Promise的API