ES-Promise
一:
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
Promise里面经常保存了未来才会结束的事件(通常是一个异步操作)
有了Promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')
回调地狱:
$('').show(1000, function () {
$('').show(function () {
$('').show(function () {
$('').show(function () {
})
})
});
})
改写成promise并配合async+await;
async function run(){
await fn1();
await fn2();
await fn3();
await fn4();
};
Promise的基本用法:promise需要接收一个回调函数作为参数
作为参数的函数,可以接收两个参数:resolve reject;
二:
1.Promise的状态;
promise总共有三种状态:
pending 进行中
fullfilled 成功(resolved)
rejected 失败
promise的状态有两种改变方式:
pending----->成功 调用resolve方法
pending----->失败 调用reject方法
promise的状态一旦发生改变,就凝固了(不可再改变了);
2.then和catch方法;
then方法可以接收两个参数,第一个参数为promise成功状态的回调函数;第二个参数为promise失败状态的回调;
catch方法:可以捕获代码中的异常;可以接收promise失败状态的回调;
3.链式调用;
then()的返回值为promise对象,则可以通过多个then的链式调用,来完成promise的顺序。
then方法中成功回调函数的返回值:
返回了一个普通数据类型 则这个数据会作为参数传递给下一个then(成功的回调)
返回了一个promise 则这个返回的promise会决定下一个then的状态;
可:p.then().then().then();
then的回调中返回一个普通类型的数据;
p.then(rst=>{
console.log(rst);
// return 'hello';
return rst+2;//返回一个普通类型的数据
}).then(rst=>{
console.log(rst);
}).catch(err=>{
console.log(err);
})
then的回调中返回一个promise;
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
}, 1000);
});
let p1=new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('我是另一个');
resolve(20);
},1500);
});
p.then(rst=>{
console.log(rst);
return p1;//返回了promise
}).then(rst=>{
console.log(rst);//20
}).catch(err=>{
console.log('失败');
})
三:Promise.all();
该方法用于将多个 Promise 实例,包装成一个新的 Promise 实例.例如:通过Promise.all()将p1,p2,p3包装为一个新的promise,则新promise的状态取决于p1,p2和p3:
若p1,p2,p3有一个失败,则p就变为失败状态
当p1,p2,p3都成功的时候,则p会变为成功状态
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
}, 1500);
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
}, 500);
});
//Promise.all可以将多个promise包装为一个新的promise,
//新promise的执行时间取决于多个promise中执行最慢的那个
let p = Promise.all([p1, p2, p3]);
p.then(rst => { //成功------>p1,p2,p3均成功
console.log(rst);
}).catch(err => {//失败
console.log('err');
})
浙公网安备 33010602011771号