Promise是一种异步编程的解决方案,能够将异步操作队列化
let p1=new Promise((resolve,reject)=>{
console.log('这是p1');//立即执行
setTimeout(()=>{ //setTimeout属于宏任务
resolve('执行成功') //属于微任务
},2000)
})
p1.then( //then属于微任务
value=>{
console.log(value);
return value+'传给第二个then'
},
reason=>{
console.log(reason);
}
).then(
value=>{ //value是上一个then的value传过来的
console.log(value); //执行成功传给第二个then
},
reason=>{
console.log(reason);
}
)//输出:这是p1 执行成功 执行成功传给第二个then。 其中 '这是p1'立即输出 后面两句2秒后一起输出
async function delay(){ //async相当于promise的语法糖
let aa= await new Promise(resolve=>{ //await相当于then的语法糖
setTimeout(()=>{
resolve('aaaaaa')
},2000)
})
console.log(aa);
}
delay() //2秒钟后输出aaaaaa
Promise有三种状态:pending(初始状态)、fulfilled(成功)、rejected(失败)。状态只能由pending->fulfilled或pending->rejected,且状态一旦发生改变就不会再改变了。
new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
)
resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
关于.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()
关于错误处理。
Promise会自动捕获内部异常,并交给rejected响应函数处理。
1、使用.catch()来捕获错误
new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('Errorrrrr')
},1000)
}).then(
(value)=>{},
)
.catch(error=>{
console.log('an Errorrrrr'+error)
})
2、使用.then()
new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('Errorrrrr')
},1000)
}).then(
(value)=>{},
error=>{console.log(error)}
)
.then的第一个参数处理resolve,第二个处理reject
推荐使用catch,catch能promise里面的错误,也能捕获.then里面的
Promise.all()
它接收一个数组作为参数
数组里可以是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()
与.all()相反,race()只要有一个promise完成,就返回这个完成的promise结果。
用途:设置请求超时。将异步请求操作和一个定时器放入race中,如果定时器先完成,则请求超时。