JavaScript学习笔记(拾玖)

34 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天, 点击查看活动详情

Promise

  1. 抽象表达: Promise 是 JS 中进行异步编程的 新解决方案 (旧方案是单纯使用回调函数)
  2. 具体表达:从语法上来说,Promise 是一个构造函数。 从功能上来说,Promise 对象用来封装一个异步操作,并且可以获取其 成功/失败 的结果值

异步编程:

  • fs 文件操作 require("fs").readFile('./index.html', (err, data) => {})、数据库操作、
  • AJAX axios.get('/server', (data) => {})
  • setTimeout定时器 setTimeout(() => {}, timeout);

旧方案:指定回调函数,必须在启动异步任务前指定。
Promise:启动异步任务 => 返回Promise 对象 => 给Promise 对象绑定回调函数。
为什么用Promise? 指定回调函数的方式更加灵活。 支持链式调用,可以解决回调地狱问题。

  • 回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
  • 回调地狱缺点:不便于阅读、不便于异常处理
  • 回调地狱解决方案:Promise链式调用

Promise API

1、Promise 构造函数 : Promise(executor) {} executor函数:执行器 (resolve, reject) = {} executor 会在 Promise 内部立即同步调用,异步操作在执行器中执行

2、Promise.prototype.then 方法:(onResolve, onRejected) => {} onResolve 函数:成功的回调函数 (value) => {} onReject 函数:失败的回调函数 (reject) => {} 指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调,返回一个新的 promise 对象

3、Promise.prototype.catch() 方法: (onReject) => {} onReject 函数:失败的回调函数 (reason) => {} then() 的语法糖,获取失败的结果

4、Promise.resolve 方法:(value) => {} value: 成功的数据或 Promise 对象 返回一个成功 / 失败的 Promise 对象
如果传入的参数为 非Promise 类型的对象,则返回的结果为成功 Promise 对象 如果传入的参数为 Promise对象,则参数的结果决定了 resolve 的结果

5、Promise.reject 方法: (reason) => {} reason:失败的原因 返回一个失败的 Promise 对象

6、Promise.all 方法:(promises) => {} promises:包含 n 个 promise的数组 返回一个新的 promise,只要有一个失败就直接失败

7、Promise.race 方法:(promises) => {} promises: 包含 n 个 promise 的数组 返回一个新的 promise,第一个完成的 promise 的结果状态就是最终的结果状态。

  let p1 = new Promise((res, rej) => {
    res("成功");
  });
  let p2 = new Promise((res, rej) => {
    rej("err");
  });
  let p3 = new Promise((res, rej) => {
    res("love");
  });
  const result = Promise.race([p1, p3, p2]);
  /**
           * Promise {<pending>}
           * [[Prototype]]: Promise
           * [[PromiseState]]: "fulfilled"
           * [[PromiseResult]]: "成功"
           * / 

 // const result = Promise.race([p2, p1, p3])
          /**
           *Promise {<pending>}
           *[[Prototype]]: Promise
           *[[PromiseState]]: "rejected"
           *[[PromiseResult]]: "err 
           */
  console.log(result);

Promise的状态改变

promise共有三种状态 【PromiseState】: pending(初始)状态、resolve / fullfied (执行成功)状态、reject(执行失败)状态
promise状态转换:pending 初始状态。 变为 resolve; pending 变为 reject。

改变状态只有两种:且一个Promise 对象只能改变一次状态。

Promise 对象中的另一个属性 Promise对象的值 【PromiseResult】 保存着异步任务【成功 / 失败】的结果 resolve,reject