JS中的异步管控-Promise/async await

Promise是ES6新增的一个内置类
  • 通过new Promise() 我们可以得到一个Promise实例,实例有两个属性
    • PromiseStatus(状态)
      • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
      • 已兑现(fulfilled): 意味着操作成功完成。
      • 已拒绝(rejected): 意味着操作失败。
    • PromiseValue
      • 存放的是Promise的值
new Promise的时候可以传一个executor函数(可执行函数),执行new Promise的时候会立刻把它执行,函数有两个参数,分别是resolve/reject,这两个参数都是函数,可以在 executor 执行的时候使用,执行后分别把Promise实例的状态值改为resolved/rejected,方法传的参数则为实例的Value值
我们所说的Promise的异步指的是resolve/rejected执行
  • 执行两个方法(其中一个)的时候不仅仅是修改状态和值,还要通知then存储的两个回调函数中的一个执行
Promise的then链机制:
  • then()中,放两个回调函数,如果实例的状态是resolved,则把第一个方法执行,如果是rejected则把第二个方法执行,参数为使用resolve/reject方法时传的参数。

  • .then返回的是一个promise实例,return的值作为下一个.then时resolove的参数,.then不论是哪个回调函数执行,只要执行不报错,返回的promise实例状态都为resolove,除非return了一个new promise 此时以return的promise实例为主

  • then链的顺延机制:如果状态一但确定,想去执行.then注入的某个方法,但是此方法没有被注册,则向下顺延(找下一个then中注册的对应方法)

Promse.all/Promise.race

  • 返回一个的新的promise实例
  • all等待所有promise实例都是成功,整体返回的实例才是成功(都对整体才是对,只要有一个假,整体就是假)
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]
  • race等待最新有返回结果的promise实例,此实例的成功和失败决定最后的成功和失败(赛跑:谁快听谁的)
const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

async、await是Promise的一个语法糖:

  • 我们可以将await关键字后面执行的代码,看做是包裹在(resolve, reject) => {函数执行}中的代码;
  • await的下一条语句,可以看做是then(res => {函数执行})中的代码;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容