Pomise是什么
Promise是一个构造函数,是es6用于解决异步编程的新方式.
Promise实例的三个状态
- Promise构造函数默认返回的实例状态是
pending
- Promise构造函数调用
resolve
之后,实例的状态态是resolved
- Promise构造函数调用
reject
之后,实例的状态是rejected
注意Promise实例对象的状态只能改变一次,
Promise怎么处理异步
Promise
接收一个函数作为参数,在函数内部封装一个异步操作,更具异步操作的结果,调用相应的函数,改变实例状态
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功的数据 ' + time) //调用resolve改变实例状态为成功
}, 1000);
}).then(
value => {
console.log('成功', value)
})
1.当实例的状态为成功,会通过then
函数执行第一个函数,失败则第二个
Promise能做什么
传统的异步通过纯回调
来解决异步,在发请求前就要准备好回调,当后一个请求依赖前一个的数据时就会产生回调地狱,不利于代码维护,和处理错误
doSomething(function(result) {
// 第一个异步任务成功启动第二个异步任务
doSomethingElse(result, function(newResult) {
// 第二个异步任务成功启动第三个异步任务
doThirdThing(newResult, function(finalResult) {
// 第三个异步任务成功了
console.log('Got the final result: ' + finalResult)
}, failureCallback)
}, failureCallback)
}, failureCallback)
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(failureCallback)
const p = new Promise((reslove,reject)=>{
setTimeout(() => {
reslove(3)
},2000);
})
setTimeout(() => {
p.then(()=>{
})
},3000);
})
then函数返回promise的特点
then函数返回promise
实例的状态更具,他执行的情况而定
- 如果返回的正常的值,那么then函数返回的就是成功的,
- 如果函数体抛出异常,那么then函数返回的就是失败的,
new Promise((resolve, reject) => {
resolve('早上好');
}).then(()=>{
return 2 // 返回一个成功的promise
}).then((value)=>{
console.log(value); //2
throw 4 //返回一个失败的promise
}).then(()=>{
},(reason)=>{
console.log(reason); console.log(reason); //4
})
- 如果返回的是promise是,那么then函数返回的promise状态跟他返回的promise状态一直
new Promise((resolve, reject) => {
resolve('早上好');
}).then(()=>{
return Promise.resolve('成功')
}).then((value)=>{
console.log(value); //成功
return Promise.reject('失败')
}).catch((reason)=>{
console.log(reason);
})
Promise的其他API
Promise.all方法接收一个由promise组成的数组
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3)
}, 1000);
})
const p2 = Promise.resolve(5)
const p4 = Promise.all([p1, p2])
p4.then(
//p4 all onResolved() (2) [3, 5]
values => console.log('p4 all onResolved()', values), // 数据的顺序与promise数组顺序一致
reason => console.log('p4 all onRejected()', reason),
)
该方法返回的promise 由他所执行的promise的状态决定如果都成功,则执行成功的回调接受一个由成功值所组成的数组
反之如果失败 则执行失败的回调,接收的值是失败promise的值
Promise.race
Promise.race方法接收一个由promise组成的数组,第一个改变状态的promise的结果就是他最终的状态,并执行相应的回调,
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3)
}, 1000);
})
const p2 = Promise.resolve(5)
const p3 = Promise.reject(4)
const p5 = Promise.race([p1, p2, p3]) //5 不考虑异步就跟存放的位置相关,靠前先执行也就先改变状态
const p5 = Promise.race([p1, p3, p2]) //4
p5.then(
value => console.log('p5 race onResolved()', value),
reason => console.log('p5 race onRejected()', reason),
)