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');
})

 

posted @ 2021-12-16 19:30  钰抌  阅读(190)  评论(0)    收藏  举报