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
- 指定回调函数的方式更加灵活
- 旧方案:必须在启动异步任务前指定回调函数
- Promise:启动异步任务=>返回Promise对象=>给Promise对象绑定回调函数,甚至可以在异步任务结束后指定回调函数。
- Promise支持链式调用,可以解决回调地狱
-
什么是回调地狱?回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件,即第二个if任务是以第一个if任务成功为前提,第三个if是以第二个成功为前提。
-
回调地狱的缺点?不便于阅读,不便于异常处理
-
使用Promide链式调用可以有效解决回调地狱,但终极解决方案是async/await
后面再整理Promise的API