美文网首页
学习笔记——Promise简单使用

学习笔记——Promise简单使用

作者: SleepWalkerLj | 来源:发表于2022-03-16 11:42 被阅读0次

Promise 是异步编程的一种解决方案,解决了传统异步方案的弊端(回调函数和事件)

异步操作

开始说promise之前,先看一段模拟的网络请求代码

function request(url, successCallback, failCallback) {
  // 模拟网络请求
  setTimeout(() => {
    if (url === "baidu") {
      // 成功
      let data = ["苹果", "香蕉", "梨子"];
      successCallback(data);
    } else {
      // 失败
      let errMsg = "请求失败";
      failCallback(errMsg);
    }
  },1000);
}

// main.js
request(
  "baidu",
  (res) => {
    console.log(res);
  },
  (err) => {
    console.log(err);
  }
);
结果.png

调用request这个请求函数,多数情况自然是为了获取请求的数据,所以很容易想到在成功或者失败的时候通过return来返回数据,但是由于网络请求是异步的,request无法获得请求返回的参数。

换个思路,通过回调函数的形式来获取值,如上代码,结果是成功了,但是这种回调的方式有很多弊端,如果是我们自己封装的request,必须要自己设计好callback名称, 并且使用好。

更好的方案:承诺(Promise),规范了代码编写的逻辑,有了承诺,就不用管什么时候返回结果,只要给一个承诺,成功的时候就调用承诺的then()方法,失败的时候就掉用承诺的catch()方法

Promise介绍

上面这个方案就是Promise,Promise是一个类,可以翻译成“承诺”,这是在es6里新增的语法,当需要给调用者一个承诺:“等下我会给你回调函数”时,就可以创建一个Promise对象。在通过new创建Promise对象时,需要传入一个回调函数,称之为executor(执行者)

  • 这个回调函数会被立即执行,该函数有两个回调函数resolve,reject
  • 调用resolve回调函数时,会执行Promise对象的then方法传入的回调函数
  • 调用reject回调函数时,会执行Promise对象的catch方法传入的回调函数

基本使用

成功时,回调resolve函数
失败时,回调reject函数
传入Promise的这个回调函数会立即执行(就是Promise的constructor中调用了这个回调函数,所以会立即执行)

// 返回一个承诺,承诺执行了resolve或者reject回调函数,就执行then或catch方法里的回调
const promise = new Promise((resolve, reject) => {
  resolve();
  // reject()
});
// then方法传入的回调函数,会在Promise执行resolve函数时被回调
promise.then((res) => {});
// catch方法传入的回调函数,会在Promise执行reject函数时被回调
promise.catch((err) => {});

结合上面网络请求的例子

// request.js
function request(url) {
  return new Promise((resolve, reject) => {
    // 模拟网络请求
    setTimeout(() => {
      if (url === "baidu") {
        // 成功
        let data = ["苹果", "香蕉", "梨子"];
        resolve(data);
      } else {
        // 失败
        let errMsg = "请求失败";
        reject(errMsg);
      }
    }, 1000);
  });
}
// main.js
// then方法传入的回调函数两个回调函数:
// > 第一个回调函数, 会在Promise执行resolve函数时, 被回调
// > 第二个回调函数, 会在Promise执行reject函数时, 被回调
request("baidu").then(
  (res) => {
    console.log(res);
  },
  (err) => {
    console.log(err);
  }
);
结果.png

Promise的状态

Promise有三种状态,这种状态不受外界影响

  • 待定(Pending):初识状态,既没有被兑现,也没有被拒绝,当执行executor中的代码时,处于该状态
  • 已兑现(Fulfilled):操作成功完成,执行了resolve时,处于该状态
  • 已拒绝(Rejected):操作失败,执行了reject时,处于该状态

一旦状态改变就不会再变 (两种状态改变:成功或失败),比如先执行了resolve,状态就变成了Fulfilled,这时再执行reject也不能将状态改成Rejected了

  • Pending -> Fulfilled
  • Pending -> Rejected

resolve参数

  1. 可以传入普通的值或者对象
  2. 可以传入一个Promise对象
new Promise((resolve, reject) => {
  // 正常情况下,状态会从pending -> fulfilled
  // 但当传入一个Promise时,状态会由resolove中传入的Promise对象来决定,相当于状态进行了移交
  resolve(
    new Promise((resolve, reject) => {
      // 这里调用resolve,才能让上一层的Promise的状态由pending转为fulfilled
      resolve("我是内部的promise");
    })
  );
}).then(
  (res) => {
    console.log(res);
  },
  (err) => {
    console.log(err);
  }
);
结果.png
  1. 传入一个对象,并且这个对象有实现then方法
new Promise((resolve, reject) => {
  const obj = {
    then: function (resolve, reject) {
      resolve("obj的then方法的resolve");
      // reject()
    },
  };
  // 传入obj时,里面的then方法会被自动执行
  resolve(obj);
}).then(
  (res) => {
    console.log(res);
  },
  (err) => {
    console.log(err);
  }
);
结果.png

相关文章

网友评论

      本文标题:学习笔记——Promise简单使用

      本文链接:https://www.haomeiwen.com/subject/mkhpdrtx.html