西西弗西西弗
  • HTML 标签简介
  • CSS 属性简介
  • JavaScript 简介
  • JavaScript Promise 详细介绍
  • Vue.js 详细介绍
  • React 详细介绍
  • Node.js 详细介绍
数据结构与算法
  • HTML 标签简介
  • CSS 属性简介
  • JavaScript 简介
  • JavaScript Promise 详细介绍
  • Vue.js 详细介绍
  • React 详细介绍
  • Node.js 详细介绍
数据结构与算法
  • JavaScript Promise 详细介绍

JavaScript Promise 详细介绍

JavaScript 的 Promise 是一种用于异步计算的对象。一个 Promise 对象代表了一个可能还不可用的值,或者一个在未来某个时间点才可用的最终值。

Promise 的状态

Promise 对象可以处于三种状态之一:

  • Pending:初始状态,既不是成功,也不是失败状态。
  • Fulfilled:意味着操作成功完成。
  • Rejected:意味着操作失败。

Promise 的使用

Promise 的基本用法如下:

const myPromise = new Promise((resolve, reject) => {
  // 异步操作...
  if (/* 异步操作成功 */) {
    resolve(value); // 将结果传递给成功的回调函数
  } else {
    reject(error); // 将错误传递给失败的回调函数
  }
});

myPromise.then(
  function(value) {
    // 处理异步操作成功的结果
  },
  function(error) {
    // 处理异步操作失败的结果
  }
);

Promise 的链式调用

Promise 支持链式调用,可以顺序执行多个异步操作:

promise1.then(result => {
  // 第一个异步操作成功
  return promise2; // 返回另一个 Promise
}).then(result => {
  // 第二个异步操作成功
});

Promise 的经典例子

以下是一些使用 Promise 的经典例子:

1. 基本的 Promise 示例

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const sum = 4 + 5 + 'a';
    if (isNaN(sum)) {
      reject('Error while calculating sum.');
    } else {
      resolve(sum);
    }
  }, 2000);
});
promise.then(result => {
  console.log(result);
}).catch(error => {
  console.log(error);
}); // 

2. Promise 链式调用

const promise1 = new Promise((resolve, reject) => resolve('promise1 success'));
const promise2 = new Promise((resolve, reject) => reject('promise2 failure'));
const promise3 = new Promise((resolve, reject) => resolve('promise3 success'));

promise1
  .then(result => {
    console.log(result);
    return promise2;
  })
  .then(result => {
    console.log(result);
    return promise3;
  })
  .then(result => {
    console.log(result);
  })
  .catch(error => {
    console.log(error);
  }); // 

3. Promise.all 示例

const promise1 = new Promise((resolve, reject) => resolve('promise1 success'));
const promise2 = new Promise((resolve, reject) => reject('promise2 failure'));
const promise3 = new Promise((resolve, reject) => resolve('promise3 success'));

Promise.all([promise1, promise2, promise3])
  .then(result => {
    console.log('resolved', result);
  })
  .catch(error => {
    console.log('rejected', error); // rejected promise2 failure
  }); // 

4. Promise.race 示例

const promise1 = new Promise((resolve, reject) => reject('promise1 failure'));
const promise2 = new Promise((resolve, reject) => resolve('promise2 success'));
const promise3 = new Promise((resolve, reject) => resolve('promise3 success'));

Promise.race([promise1, promise2, promise3])
  .then(result => {
    console.log('resolved', result); // resolved promise2 success
  })
  .catch(error => {
    console.log('rejected', error);
  }); // 

5. Promise.allSettled 示例

const promise1 = new Promise((resolve, reject) => reject('promise1 failure'));
const promise2 = new Promise((resolve, reject) => resolve('promise2 success'));
const promise3 = new Promise((resolve, reject) => resolve('promise3 success'));

Promise.allSettled([promise1, promise2, promise3]).then((result) => {
  console.log('resolved', result);
  // 输出结果将包含每个 Promise 的状态(fulfilled 或 rejected)和值
}); // 

Promise 的源码实现

Promise 的核心在于其构造函数和 then 方法的实现。以下是一个简化的 Promise 构造函数的实现:

class MyPromise {
  constructor(executor) {
    this.state = 'pending';
    this.value = null;
    this.handlers = [];

    try {
      executor(this._resolve, this._reject);
    } catch (err) {
      this._reject(err);
    }
  }

  _resolve = (value) => {
    // ...
  };

  _reject = (reason) => {
    // ...
  };

  then(onFulfilled, onRejected) {
    // ...
    return new MyPromise((resolve, reject) => {
      // ...
    });
  }
}

这个简化的实现展示了 Promise 的基本结构,包括状态管理、值的传递以及异步回调的注册。

总结

Promise 是 JavaScript 中处理异步操作的强大工具,它允许我们以一种更直观和可维护的方式编写异步代码。通过链式调用和组合使用 Promise 的各种方法,我们可以有效地管理和执行复杂的异步任务。

Last Updated:
Contributors: Lee