promise是es6 中专门用来处理异步回调的,可以解决回调地狱
Promise
1.理解为一个类,因此可以通过new 实例化对象;跟一个函数作为参数,函数中有两个参数;分别是
resolve reject
2. promise状态,三个状态
pending -- 进行中
\fulfilled -- 成功 调用resolve,会自动转化为成功状态
\rejected -- 失败 调用reject,会自动转化为失败状态
状态是不可逆的
3.Promise理解为在new出来的实例原型上有then catch两个方法
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('执行完成');
resolve('随便什么数据');
}, 2000);
});
\ then 有两个参数(函数),第一个参数接收成功和第二个参数失败的函数
new Promise((resolve, reject)=>{
//做一些异步操作
setTimeout(function(){
resolve('你好');
}, 2000);
}).then((val)=>{ // 成功的then方法
console.log(val) // 会输出一个 '你好'
})
\ catch 接收失败的函数
new Promise((resolve, reject)=>{
//做一些异步操作
setTimeout(function(){
resolve('你好');
}, 2000);
}).then((val)=>{ // 成功的then方法
console.log(val) // 会输出一个 '你好'
}) .catch((err)=>{
console.log('a',error)
//then方法回调错误后 自动出发 catch错误捕获 交给rejected响应函数处理
})
4.Promise.all 接收多个promise,并且是成功状态的,输出的参数值是一个数组,数组的顺序和参数顺序一致
function cutUp(){
console.log('12');
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('11');
resolve('21');
}, 1000);
});
return p;
}
function boil(){
console.log('ab');
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('aa!');
resolve('ba');
}, 1000);
});
return p;
}
Promise.all([cutUp(), boil()])
.then((result) => {
console.log('没有了');
console.log(result);
})
.Promise.race 接收多个promise,返回的是最快返回的
let p1 = new Promise(resolve => {
setTimeout(() => {
resolve(' p1 ')
}, 1000)
});
let p2 = new Promise(resolve => {
setTimeout(() => {
resolve(' p2 ')
}, 2000)
});
Promise.race([p1, p2])
.then(value => {
console.log(value)
})