likes
comments
collection
share

必握技能——Promise 简介及使用

作者站长头像
站长
· 阅读数 23

概念

Promise 是 JavaScript 中的一种异步编程解决方案,它可以让我们更加优雅地处理异步操作,避免回调地狱,提高代码的可读性和可维护性。

一、Promise 的基本概念

Promise 是一个对象,它代表了一个异步操作的最终完成或失败。Promise 可以有三种状态:Pending(进行中)、Fulfilled(已完成)和Rejected(已失败)。当 Promise 进入 Fulfilled 状态时,会调用 Promise.then() 方法,当 Promise 进入 Rejected 状态时,会调用 Promise.catch() 方法。

二、Promise 的状态

Promise 有三种状态:Pending、Fulfilled 和 Rejected。

1. Pending(进行中)

当 Promise 刚刚创建时,它的状态为 Pending,表示异步操作还在进行中。

2. Fulfilled(已完成)

当异步操作成功完成时,Promise 的状态会变为 Fulfilled,表示异步操作已经完成。

3. Rejected(已失败)

当异步操作失败时,Promise 的状态会变为 Rejected,表示异步操作已经失败。

三、Promise 的方法

Promise 有一些方法,可以帮助我们更好地处理异步操作。

1. Promise.resolve()

Promise.resolve() 方法返回一个已经被解决的 Promise 对象,它的状态为 Fulfilled。

示例代码:

Copyconst promise = Promise.resolve('Hello World');
promise.then((value) => {
  console.log(value); // 输出:Hello World
});

2. Promise.reject()

Promise.reject() 方法返回一个已经被拒绝的 Promise 对象,它的状态为 Rejected。

示例代码:

Copyconst promise = Promise.reject(new Error('Something went wrong'));
promise.catch((error) => {
  console.error(error); // 输出:Error: Something went wrong
});

3. Promise.all()

Promise.all() 方法接收一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。当所有的 Promise 对象都成功完成时,新的 Promise 对象的状态为 Fulfilled,返回的值是一个由所有 Promise 对象的返回值组成的数组。当其中一个 Promise 对象失败时,新的 Promise 对象的状态为 Rejected,返回的值是第一个失败的 Promise 对象的错误信息。

示例代码:

Copyconst promise1 = Promise.resolve('Hello');
const promise2 = Promise.resolve('World');
const promise3 = Promise.reject(new Error('Something went wrong'));

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values); // 输出:[ 'Hello', 'World' ]
  })
  .catch((error) => {
    console.error(error); // 输出:Error: Something went wrong
  });

4. Promise.race()

Promise.race() 方法接收一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。当其中一个 Promise 对象完成时,新的 Promise 对象的状态为该 Promise 对象的状态,返回的值是该 Promise 对象的返回值或错误信息。

示例代码:

Copyconst promise1 = new Promise((resolve) => setTimeout(resolve, 1000, 'Hello'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 2000, 'World'));

Promise.race([promise1, promise2])
  .then((value) => {
    console.log(value); // 输出:Hello
  })
  .catch((error) => {
    console.error(error);
  });

四、Promise 的链式调用

Promise 的链式调用是 Promise 的一个重要特性,它可以让我们更加优雅地处理异步操作。在 Promise 的链式调用中,每个 then() 方法都会返回一个新的 Promise 对象,可以继续调用 then() 方法或 catch() 方法。

示例代码:

Copyfetch('https://api.github.com/users/octocat')
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

在上面的代码中,我们首先使用 fetch() 函数获取 GitHub 上的 octocat 用户信息,然后使用 then() 方法将响应转换为 JSON 格式,再使用 then() 方法将 JSON 数据输出到控制台。如果出现错误,我们会使用 catch() 方法捕获错误并输出到控制台。

五、Promise 的错误处理

在 Promise 中,我们可以使用 catch() 方法捕获错误并进行处理。catch() 方法会返回一个新的 Promise 对象,它的状态为 Fulfilled。

示例代码:

Copyfetch('https://api.github.com/users/octocat')
  .then((response) => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

在上面的代码中,我们首先使用 fetch() 函数获取 GitHub 上的 octocat 用户信息,然后使用 then() 方法判断响应是否成功,如果响应失败,则使用 throw 抛出一个错误。如果响应成功,则使用 then() 方法将 JSON 数据输出到控制台。如果出现错误,我们会使用 catch() 方法捕获错误并输出到控制台。

六、API介绍

1.Promise构造函数接受一个函数作为参数,这个函数包含两个参数,分别是resolve和reject。resolve用于将Promise对象的状态改为fulfilled,reject用于将Promise对象的状态改为rejected。

Copyconst promise = new Promise((resolve, reject) => {
  // 异步操作
  if (/* 异步操作成功 */) {
    resolve(/* 异步操作返回的结果 */);
  } else {
    reject(/* 异步操作返回的错误信息 */);
  }
});

2. Promise.prototype.then()

Promise.prototype.then()用于处理Promise对象的成功状态。它接受两个函数作为参数,第一个函数用于处理成功状态的结果,第二个函数用于处理失败状态的结果。

Copypromise.then(result => {
  // 处理成功状态的结果
}).catch(error => {
  // 处理失败状态的结果
});

3. Promise.prototype.catch()

Promise.prototype.catch()用于处理Promise对象的失败状态。它接受一个函数作为参数,用于处理失败状态的结果。

Copypromise.catch(error => {
  // 处理失败状态的结果
});

4. Promise.prototype.finally()

Promise.prototype.finally()用于在Promise对象的状态改变后执行指定的操作。它接受一个函数作为参数,这个函数在Promise对象的状态改变后执行。

Copypromise.finally(() => {
  // 在Promise对象的状态改变后执行的操作
});

5. Promise.all()

Promise.all()接受一个Promise对象数组作为参数,返回一个新的Promise对象。当所有的Promise对象都变为fulfilled状态时,返回的Promise对象的状态也变为fulfilled状态,返回的结果是所有Promise对象的结果组成的数组。当其中任意一个Promise对象变为rejected状态时,返回的Promise对象的状态也变为rejected状态,返回的结果是第一个变为rejected状态的Promise对象的结果。

CopyPromise.all([promise1, promise2, promise3]).then(results => {
  // 处理所有Promise对象都变为fulfilled状态的结果
}).catch(error => {
  // 处理其中任意一个Promise对象变为rejected状态的结果
});

6. Promise.race()

Promise.race()接受一个Promise对象数组作为参数,返回一个新的Promise对象。当其中任意一个Promise对象变为fulfilled或rejected状态时,返回的Promise对象的状态也变为相应的状态,返回的结果是第一个变为fulfilled或rejected状态的Promise对象的结果。

CopyPromise.race([promise1, promise2, promise3]).then(result => {
  // 处理第一个变为fulfilled状态的Promise对象的结果
}).catch(error => {
  // 处理第一个变为rejected状态的Promise对象的结果
});

7. Promise.resolve()

Promise.resolve()用于返回一个状态为fulfilled的Promise对象,它接受一个参数作为返回的结果。

Copyconst promise = Promise.resolve(/* 返回的结果 */);

8. Promise.reject()

Promise.reject()用于返回一个状态为rejected的Promise对象,它接受一个参数作为返回的错误信息。

Copyconst promise = Promise.reject(/* 返回的错误信息 */);

七、总结

Promise 是一种强大的异步编程解决方案,它可以让我们更加优雅地处理异步操作,避免回调地狱,提高代码的可读性和可维护性。在实际开发中,我们可以根据具体的需求选择合适的方法来使用 Promise,从而提高代码的性能和可靠性。

转载自:https://juejin.cn/post/7247035267000631357
评论
请登录