知识点Promise

121 阅读3分钟

一、promise含义

promise是一套专门处理异步场景的规范,它能有效的避免回调地狱的产生,使异步代码更加清晰,简洁,统一。

二、 promise的规定

  1. 所有的异步场景,都可以看做是一个异步任务,每个异步任务,在JS中应表现为一个对象,该对象称之为promise对象,也叫作做任务对象如:发送表白信息,远程登录,延时弹窗。
  2. 每个任务对象,都有两个阶段,三个状态。
  3. 挂起=>完成,称为resolve;挂起=>失败,称为reject。任务完成时,可能有一个相关数据;任务失败时,可能有一个失败原因。
  4. 可以针对任务进行后续处理,针对完成状态的后续处理称之为onFulfilled,针对失败的后续处理称之为onRejected

屏幕截图 2022-11-14 090700.jpg

三、promise API

  1. 含义:ES6提供一套API,实现了promise规范。
  2. catch方法:.catch(onRejected)=.then(null,onRejected)
  3. 使用(见下面例题)
//在一秒钟之后输出finish
function delay(time){
  return new Promise(resolve,reject)=>{
    setTimeout(()=>{
      resolve();
    },time)
  }
}

delay(1000).then(()=>{
  console.log(finish);
})

四、Promise的链式调用

屏幕截图 2022-11-17 104359.jpg

  1. then方法必定会返回一个新的Promise,可理解为,后续处理一个新任务。
  2. 新任务的状态取决于后续处理:
  • 若没有相关后续处理,新任务的状态和前任务一致,数据为前任务的数据。
//pro1是完成状态,pro1的后续处理是针对失败进行处理,则pro2的状态和pro1一致(fulfilled),数据为1
const pro1=new Promise((resolve,rejcted)={
  console.log('学习');
  resolve(1);
})
const pro2=pro1.catch(()=>{
  console.log('失败!');
});
  • 若有相关的后续处理但还未执行,新任务挂起。
//pro1有相关后续处理,但是在五秒以内都处于未执行状态,所以pro2的状态挂起,此时的pro1的状态也是挂起。
const pro1=new Promise((resolve,reject)={
  setTimeout(()=>{
  resolve();
  },5000)
});
const pro2=pro1.then(()=>{
  console.log('考试');
});
  • 若后续处理执行了,则根据后续处理的情况确定新任务的状态。
1.后续处理执行无错,状态完成,数据为手续处理的返回值。
const pro1=new Promise((resolve,reject)={
  console.log('学习');
  resolve();
});
//有相关后续处理,且无错,完成状态,数据为1.
const pro2=pro1.then(()=>{
  console.log('考试');
  return 1;
});

2.后续处理执行无错,状态失败,数据为异常对象。
const pro1=new Promise((resolve,rejct)={
  console.log('学习');
  resolve();
});
//有相关后续处理,抛出错误,失败状态,数据为Error(2).
const pro2=pro1.then(()=>{
  thow new Error(2);
});

3.后续处理执行无错,返回的是一个任务对象,新任务的状态和数据与该任务对象一致。
const pro1=new Promise((resolve,rejct)={
  resolve();
});
//有相关后续处理,后续处理返回一个任务对象,则pro2的状态和数据与该返回的任务对象一致,Pro2为失败状态,数据为undefined.
const pro2=pro1.then(()=>{
  return new Promise((resolve,reject)=>{
    reject();
  })
});

五、Promise的静态方法

屏幕截图 2022-11-17 202853.jpg

六、async和await

  1. 消除回调 : 有了Promise,异步任务就有了一种统一的处理方式。有了一种统一的处理方式,ES官方就可以对其进行进一步优化。虽然Promise消除了回调函数,但没有消除回调(pro.then().then()),因此在ES7中提出了async和await,用于更加优雅的表示Promise。
  2. async : 用于修饰函数,被它修的函数,一定返回Promise。
async function hello(){
// 该函数返回值是Promise完成后的数据
//相当于 return new Promise.resolve(1);
  return 1;
}
hello();
//返回Promise{1}

async function hello2(){
  trow new Error(1);//若执行过程中报错,则该任务是rejected
}
hello();
//返回Promise{<rejected> Error(1)}
  1. await : 表示等某个Promise的完成,它必须用于async函数中。
async function hello(){
  const n=await Promise.resolve(1);
  console.log(n);//1
}
//等同于
function hello(){
  return new Promise((resolve,reject)=>{
    Promise.resolve(1).then(n=>{
      console.log(1);
      resolve(1);
    })
  })
}