JavaScript中Promise详解

概述

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

Promise的使用

Promise创建时需传入一个 执行器函数(excutor) 接受两个参数,第一个参数是内部定义成功状态时调用的函数(习惯命名为resolve),第二个参数是内部定义失败状态时调用的函数(习惯命名为reject)

let promise = new Promise((resolve, reject) => {
    if (status >= 200 && status < 300) {
        resolve('成功了');
    } else {
        reject('失败了');
    }
});

执行器函数中的代码为同步代码,会立即同步调用,resolve() 或 reject() 只能指定一次状态,如果调用多个resolve() 和 reject(),则以第一个为准,后面的不会执行

Promise的三种状态

Promise实例身上有两个属性,如下:

PromiseState属性即为实例的状态,它必然处于以下几种状态之一:

  • pending:初始状态,既没有被兑现,也没有被拒绝。
  • fulfilled:意味着操作成功完成。
  • rejected:意味着操作失败。

通过 resolve 或 reject 指定状态后,会自动调用对应的 then() 方法或 catch() 方法,传入 resolve 或 reject 的参数将作为 then() 或 catch() 中回调函数的参数

then()方法

then() 方法可接受两个参数,第一个参数作为处理成功状态的回调函数,而第二个参数则作为处理失败状态的回调函数。每一个 then() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用

    let promise = new Promise((resolve, reject) => {
        let status = 202; //或304
        if (status > 200 && status < 300) {
          resolve('请求成功了');
        } else {
          reject('请求失败了');
        }
      });
      promise.then(
        (value) => {
          console.log('成功:' + value);
        },
        (error) => {
          console.log('失败:' + error);
        }
    );

当status为202时第一个回调被调用

 当status为304时第二个回调被调用

catch()方法

catch() 方法接受一个参数,作为处理失败状态的回调函数。每一个 catch() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用

    let promise = new Promise((resolve, reject) => {
        let status = 304;
        if (status > 200 && status < 300) {
          resolve('请求成功了');
        } else {
          reject('请求失败了');
        }
      });
      promise.catch((error) => {
        console.log(error);
    });

链式调用

链式调用的过程中 then() 方法或 catch() 方法的回调的返回值会作为下一个 then() 方法的回调的参数,无返回值也可继续 .then(),如果没有错误,catch 方法将发生穿透。

      new Promise((resolve, reject) => {
        resolve('请求成功了');
      })
        .then((value) => {
          console.log(value);
          return new Error('错误');
        })
        .catch(() => {
          console.log('错误'); //未打印,发生穿透
        })
        .then((value) => {
          console.log(111);
        })
        .then((value) => {
          console.log(222);
        })

 

若通过throw抛出错误,后面如果有 catch 则会进入 catch 方法,catch 前面的 then 方法将发生穿透,后面如果没有 catch 方法Promise将止步于报错的那一行

      new Promise((resolve, reject) => {
        resolve('请求成功了');
      })
        .then((value) => {
          console.log(value);
          throw new Error('错误');
        })
        .then((value) => {
          console.log(111); //未打印,发生穿透
        })
        .catch((error) => {
          console.log(error);
        })
        .then((value) => {
          console.log(222);
        });

 

posted @ 2022-09-27 15:55  Lamb~  阅读(477)  评论(0编辑  收藏  举报