Appearance

Promise

Pcjmy2022-06-27JavaScriptJavaScript

Promise

Promise 是异步操作的一种解决方案

什么时候使用 Promise?

Promise 一般用来解决层层嵌套的回调函数(回调地狱 callback hell)的问题

基本用法

Promise 解决的不是回调函数,而是回调地狱。

const p = new Promise((resolve, reject) => {
  //Promise有3种状态,一开始是pending(未完成),执行resolve,变成fulfilled(resolved),已成功
  //Promise的状态一旦变化,就不会再改变了

  //pending->fulfilled
  resolve();

  //pending->rejected
  reject();
});
p.then(
  (data) => {
    console.log("sucess", data);
  },
  (err) => {
    console.log("error", err);
  }
);

基本使用

  • new Promise 实例,而且要 return
  • new Promise 时要传入函数,函数有 resolve reject 两个参数
  • 成功时执行 resolve() 失败时执行 reject()
  • then 监听结果

实例方法

//当Promise状态发生变化时,不论如何变化都会执行,不变化不执行
new Promise((resolve, reject) => {
  reject("reason");
})
  .finally((data) => {
    console.log(data);
  })
  .catch((err) => {});

then()

1.什么时候执行
pending->fulfilled 时,执行 then 的第一个回调函数
pending->rejected 时,执行 then 的第二个回调函数

2.执行后的返回值
then 方法执行后返回一个新的 Promise 对象

3.then 方法返回的 Promise 对象的状态改变

Promise.all

// Promise.all接收一个promise对象的数组
// 待全部完成之后,统一执行success
Promise.all([result1, result2]).then(datas => {
    // 接收到的datas是一个数组,依次包含了多个promise返回的内容
    console.log(datas[0])
    console.log(datas[1])
})

Promise.race

// Promise.race接收一个包含多个promise对象的数组
// 只要有一个完成,就执行success
Promise.race([result1, result2]).then(data => {
    // data即最先执行完成的promise的返回值
    console.log(data)
})

应用

使用 Promise 实现红绿灯

function light(color, delay) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(color);
      resolve();
    }, delay);
  });
}

function step() {
  light("red", 3000)
    .then(() => {
      return light("yellow", 1000);
    })
    .then(() => {
      return light("green", 3000);
    })
    .then(() => {
      return step();
    });
}

step();
Last Updated 2023-01-05 13:51:55