promise是什么?
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
Promise`对象代表一个异步操作,三种状态
pendding : 挂起(等待) 处于未决阶段,表示当前事情还处于挂起状态最终结果没有出现
resolved : 已处理 处于已决阶段,表现是事情已经出现了结果,这个结果是一个成功的结果,可以按照当前结果的正常逻辑顺序继续下去的结果
rejected : 已拒绝 处于已决阶段,表现是事情已经出现了结果,这个结果是一个未成功的结果,当前结果的并不能按照正常逻辑顺序继续下去的结果
注:一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
如何创建的
let p = new Promise(function(resolve, reject){
resolve('要返回的数据可以任何数据例如接口返回数据');
// reject('要返回的数据可以任何数据例如接口返回数据');
});
p.then((data)=>{
//执行代码逻辑
console.log(data)//成功
};
)
p.catch(err=>{
console.log("有一个先失败的情况",err)//失败
})
成功的用then返回,失败的用catch返回
采用链式的then,可以指定一组按照次序调用的回调函数。这个时候前面的一个返回的可能是另外一个Promise对象(也就是说有异步操作)。这样后面的这个Promise就依赖于前面Promise对象的状态。
finally()
ES2018出来的,没有参数,当promise为已决时运行该函数
1.用来测试promise是否已到已决状态
2.对于异步操作完成后不论结果如何的后续操作
function fun(){
return new Promise((resovle,reject)=>{
setTimeout(()=>{
if(Math.random()<0.3){
resovle(true);
}else{
// throw("11111111");
reject();
}
},500)
})
}
let pro=fun();
pro.finally(()=>{
console.log("11");
})
reject返回的(会报错)
reject返回的(不报错)
构造函数成员(静态成员)就是能简写
resolve()
const pro = Promise.resolve(1);
等同于
const pro = new Promise((resolve,reject)=>{
resolve(1)
})
reject()
const pro= Promise.reject(2)
等同于
const pro = new Promise((resolve,reject)=>{
reject(2)
})
注:如果传递的是一个promise,则直接返回传递的promise对象
Promise.all()
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
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(function(results){
console.log("写作业的工具都买好了");
console.log(results);
});
async
async 用于去修饰函数(函数声明和函数表达式),放在函数的开始位置,被修饰的函数一定返回一个promise对象
async function test(){
return 123;
// throw 456;
}
const pro = test();
console.log(pro)
如果有错误
// 如果async中有错误的时候
async function getPromise(){
if(Math.random() < 0.5){
return 1;
}else {
throw 2;
}
}
async function test(){
getPromise().then(data =>{
const result = data;
console.log("正常",result)
},err => {
console.log("错误",err);
})
}
test()
await 等待
相当于then方法,await必须写在async函数里面
async function test1(){
return 123;
}
async function test2(){
const result = await test1();
console.log(result)
}
test2()