promise:
作用: 解决异步回调问题
传统方式,大部分用回调函数,事件触发等
ajax(url,{ //获取token
ajax(url,()=>{ //获取用户信息
ajax(url, ()=>{
//获取用户相关新闻
})
})
})
promise语法:
第一种
{
//语法
let promise = new Promise(function(resolve,reject){
//resolve 成功调用
//reject 失败调用
});
promise.then(res=>{
},err=>{
});
promise.catch(err=>{
})
}
第二种
new Promise().then(res=>{
}).catch(err=>{
})
new Promise().then(res=>{
}).catch(err=>{
})
Promise.resolve('aa') : 将现有的东西,转成一个promise对象, resolve状态,成功状态
等价于:
new Promise(resolve =>{
resolve('aaa')
});
Promise.reject('aaa'): 将现有的东西,转成一个promise对象,reject状态,失败状态
等价于:
new Promise((resolve, reject) =>{
reject('aaa')
});
Promise.all与race
Promise.all([p1,p2,p3]); 把promise
打包,扔到一个数组里面,打包完还是一个promise
对象; 必须确保,所有的promise对象,都是resolve状态,都是成功状态
Promise.race([p1, p2, p3]): 只要有一个成功,就返回
案例:用户登录之后,基于用户登录来获取用户的信息
<script>let status = 1;
let userLogin = (resolve, reject) =>{
setTimeout(()=>{
if(status == 1){
resolve({data:'登录成功', msg:'xxx', token:'xxsadfsadfas'});
}else{
reject('失败了');
}
},2000);
};
let getUserInfo = (resolve, reject) =>{
setTimeout(()=>{
if(status == 1){
resolve({data:'获取用户信息成功', msg:'asdfasdf', token:'xxsadfsadfas'});
}else{
reject('失败了');
}
},1000);
}
new Promise(userLogin).then(res=>{
console.log('用户登录成功');
return new Promise(getUserInfo);
}).then(res=>{
console.log('获取用户信息成功');
console.log(res);
})
</script>