Promise产生条件
- 标题非常多的应用场景我们不能立即知道应该如何继续往下执行。常见的一个场景就是ajax请求。得到返回值的时间也是不同的,这个时候我们就需要等待,结果出来了之后才知道怎么样继续下去。
- ajax请求的其中一个参数,得从上一个ajax请求中获取,这个时候我们就不得不等待上一个接口请求完成之后,再请求后一个接口。当出现第三个ajax(甚至更多)仍然依赖上一个请求时,我们的代码就变成了一场灾难。这场灾难,往往也被称为回调地狱。
- 为了解决回调地狱,为了代码更加具有可读性和可维护性,我们需要将数据请求与数据处理明确的区分开来。
Promise原生思路
Promise
Promise包含三种状态,三种状态不受外界影响,而且状态只能从pending改变为resolved或者rejected,并且不可逆。
- pending: 等待中,或者进行中,表示还没有得到结果
- resolved(Fulfilled): 已经完成,表示得到了我们想要的结果,可以继续往下执行
- rejected: 也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行
Promise原生思想执行实例
- 在一个功能执行前,必须在前一个功能完成后
function one(two){
console.log(123)
if(typeof two === 'function'){
console.log('达到标准,可以执行')
two() //456
} else {
console.log('不达标,不能执行')
}
}
function two(){
console.log(456)
}
one(two)
Promise做法
- new Promise().then(resolve处理函数,reject处理函数)
Promise对象中的then方法,可以接收构造函数中处理resolve状态变化,并分别对应执行。then方法有2个参数,第一个函数接收resolved状态的执行,第二个参数接收reject状态的执行。
- new Promise().then(resolve处理函数).then(reject处理函数)
- new Promise().then(resolve处理函数).catch(reject处理函数)
Promise中catch方法,用于处理构造函数中reject状态变化,
①、等效于第一个then中第二个参数的执行内容
②、等效于Promise构造函数执行后第二个then方法的执行内容
- 使用Promise语法完成指定功能,方式一
function one(two){
console.log(123)
return new Promise(function(resolve, reject){
if(typeof two === 'function'){
resolve()
} else {
reject()
}
})
}
function two(){
console.log(456)
}
①第一种写法
one(two).then(function(){
two() //456
}).catch(function(){
console.log('条件不允许')
})
②第二种写法
one(two).then(two).catch(function(){
console.log('条件不允许')
})
- 方式二
function one(two){
console.log(123)
new Promise(function(resolve, reject){
if(typeof two !== 'function'){
resolve()
} else{
reject()
}
}).then(function(){
two()
},function(){
console.log('答案不合适')
})
}
function two(){
console.log(456)
}
one(two)
Promise实际执行
function.then(①).then(②).catch(③)
1、
当function返回一个非promise时报错,
当function返回一个promise时继续执行链式编程
2、
当function返回一个promise且状态为resolve时执行①函数内容
当function返回一个promise且状态为reject时,直接执行③内容
3、
当function返回一个promise且①函数执行完成并返回一个promise
当该promise执行结果为resolve时执行③函数
当promise执行结果为reject时直接执行③函数