Promise

76 阅读2分钟

Promise

含义:

Promise对象是一个构造函数。一旦创建它就会立即执行,不能中途取消

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject

有三种状态:pending初始,fulfilled成功,rejected失败,一旦发生,状态就会凝固,不会再变

1.创建 Promise

新建一个构造函数,两个参数,都是函数resolve(value),reject(error);

const promise = new Promise((resolve, reject) => {
  // 异步操作
  if (/* 成功条件 */) {
    resolve(value); // 成功时调用
  } else {
    reject(error); // 失败时调用
  }
});

2.实例方法

2.1then() - 处理 Promise 的成功状态

promise.then(
  value => { /* 处理成功结果 */ },
);

2.2catch() - 处理 Promise 的失败状态

promise.catch(
  error => { /* 处理错误 */ }
);

2.3finally() - 无论成功失败都会执行

promise.finally(
  () => { /* 清理操作 */ }
);

3.静态方法

Promise.all()

  • 等待所有 Promise 完成

适用场景:

  • 需要等待多个不相关的异步操作全部完成
  • 需要保持多个异步结果的顺序
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The first promise has resolved');
    resolve(10);
  }, 1 * 1000);
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The second promise has resolved');
    resolve(20);
  }, 2 * 1000);
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The third promise has resolved');
    resolve(30);
  }, 3 * 1000);
});

Promise.all([p1, p2, p3]).then((results) => {
  const total = results.reduce((p, c) => p + c);
  //返回值是一个数组,包含所有输入 Promise 的 解析值(resolve values),且顺序与输入顺序一致
  console.log(`Results:`,results);
  console.log(`Total: ${total}`);
});
//返回的是 第一个被拒绝的 Promise 的原因(rejection reason)
const p1 = Promise.resolve(1);
const p2 = Promise.reject('Error occurred');
const p3 = Promise.resolve(3);
Promise.all([p1, p2, p3])
  .catch(reason => {
    console.log(reason); // "Error occurred"
  });

注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法

Promise.allSettled()

  • 等待所有 Promise 完成(无论成功失败)
const p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(10);
    }, 1 * 1000);

});

const p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject(20);
    }, 2 * 1000);
});

Promise.allSettled([p1, p2])
    .then((result) => {
        console.log(result);
    });

image.png

Promise.race()

  • 返回第一个完成的 Promise
Promise.race([promise1, promise2, ...])
  .then(value => { /* 第一个成功的 Promise */ })
  .catch(error => { /* 第一个失败的 Promise */ });

Promise.any()

  • 返回第一个成功的 Promise
Promise.any([promise1, promise2, ...])
  .then(value => { /* 第一个成功的 Promise */ })
  .catch(errors => { /* 所有 Promise 都失败 */ });

Promise.resolve()/reject() 创建已解决/拒绝的Promise

promise的练习题 juejin.cn/post/684490…