Promise初步学习

156 阅读2分钟

这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

这里先不讨论promise的问题,先讨论一些promise之前的一些问题。

问题

1. 实现执行doSth方法几次之后,去执行回调函数cb

// 高阶函数:函数的参数中有函数(一个函数接收一个函数参数),或者是像闭包一样返回一个函数
/**
 * @description 执行doSth方法几次之后,去执行cb
 * @param {*} t 次数
 * @param {*} cb 回调
 */
function doSth(t, cb) {
  return function () {
    if (--t === 0) {
      cb()
    }
  }
}
function logSth() {
  console.log('我终于找到女朋友了!呀呼~~~');
}
let fn = doSth(4, logSth)
// fn调用4次之后才会执行
fn()
fn()
fn()
fn()

2. 模拟回调函数出现的现象

回调地狱:不好维护,函数里面是可以无限往下走的。比如之前使用$.ajax()方法请求数据的时候,需要等返回结果,然后把返回结果传入下一个ajax方法中,一层套一层的执行不同的任务。 image.png

3. 异步

对于异步方法,谁先回结果谁后回结果是不知道的。在处理异步请求的过程中,往往是需要它是同步的 。 上一个请求有结果之后,才能去进行当前需要做的事情。

如:任务A、B,任务B需要任务A的结果去进行下一步的事情,这是一个同步的问题 回调地狱:在异步编程的基础上,要做到一个同步的结果

Promise

Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。

Promise的状态

每一个Promise对象都有以下三种状态:

  • PENDING : 进行中,Promise 对象的初始状态
  • FULFILLED : 已成功
  • REJECTED : 已失败

每一个 Promise 对象只能由 PENDING 状态变成 FULFILLEDREJECTED,且状态发生变化以后就能再改变了 ---- 记住这个特性
resolve reject pending
pending -> resolved
pending -> rejected
反过来是不行
resolved <-> rejected

image.png

image.png

promise了解

promise从英文来说是承诺的意思,所以就可能有以下几种情况:

image.png

promise是解决异步流程化的一种手段(异步:互不相干,互不影响; 流程化:用异步这种方法的时候,需要一个先后顺序)

需要注意的特点: Promise是一个构造函数,需要通过new 创建。 Promise有且只有一个参数叫做executor(执行器),executor有两个参数,resolve和reject,并且都是函数。executor执行器在new Promise时执行调用,executor是同步执行的。

image.png