简介
使用原因:解决异步回调的问题
当你进行一个操作需要用到三四个接口中的数据,你需要等到他们都有响应才能操作这个时候你的写法就要嵌套多层,后期维护起来很麻烦,而且也不直观
我们称呼上前多个异步嵌套为回调地狱
详细介绍
简单使用
new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
)
Promise的两个参数
resolve:表示返回 代码块中成功状态 ,会被then方法中的第一个回调函数所接收
reject:表示返回代码块中失败状态,会被then方法中的第二个回调函数所接收
这两种状态返回的都是一个promise实例,所以才能调用then方法
Promise的三种状态
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
promise状态一经改变,不会再变。
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了
promise实例的方法
then()接收promise实例中返回的结果
简单实例
new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
).then(
(res)=>{ },
(res)=>{ },
)
两个参数的介绍
第一个回调函数:接收promise实例中返回成功的结果
第二个回调函数:接收promise实例中返回的失败结果
注意点
1,且then方法返回的是一个promise实例,所以他后面还是可以使用then方法等
2,第二个回调只能接收前面实例对象中的错误,第7行的then只能捕获1-6中的错误,但是他不能捕获第一个回调函数(第8行)中的错误
3,第10行的then可以捕获到1-10中的所有错误,包括上面没办法捕获的第8行中的错误
4,then的错误捕获遵循就近原则,假如7行的then没有第二个回调,第10 行then有第二个回调,那么1-6和8-9的错误会被 12行 捕获,假如第7行中的then有第二个函数,1-6的错误直接被第9行捕获,8-9会被12捕获
catch捕获错误
1,作用和then的第二个回调类似,但比他捕获的范围广(能多捕获then中的第一个回调函数中的错误)
2,也遵循就近原则,简单来说就是能捕获从上一个catch或then中第二个回调后面的所有错误
new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
).catch(
(res)=>{
},
)
Promise.all() 批量执行
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
//切菜
function cutUp(){
console.log('开始切菜。');
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('切菜完毕!');
resolve('切好的菜');
}, 1000);
});
return p;
}
//烧水
function boil(){
console.log('开始烧水。');
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('烧水完毕!');
resolve('烧好的水');
}, 1000);
});
return p;
}
Promise.all([cutUp(), boil()])
.then((result) => {
console.log('准备工作完毕');
console.log(result);
})
Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成
let p1 = new Promise(resolve => {
setTimeout(() => {
resolve('I\`m p1 ')
}, 1000)
});
let p2 = new Promise(resolve => {
setTimeout(() => {
resolve('I\`m p2 ')
}, 2000)
});
Promise.race([p1, p2])
.then(value => {
console.log(value)
})
finally() 无论对错都会被执行
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
//在执行完then和catch后,仍然执行finally()
Promise.resolve() 将普通数据转化为promise成功实例
Promise.reject() 将普通数据转化为promise成功实例
let obj={name:123}
obj.then()//这个时候会报错
let Pobj= Promise.resolve(obj)
Pobj.then()//这个时候就可以