当前位置: 首页 > 开发者资讯

JavaScript中的异步编程如何实现?使用Promises与Async/Await

  在JavaScript中,异步编程是处理需要等待结果的操作(如网络请求、文件读取、定时器等)的关键方式。异步编程使得我们能够在等待某些操作完成时,继续执行其他任务,从而提升性能和用户体验。

  JavaScript提供了几种实现异步编程的方式,其中最常见的两种是Promises和async/await。

  1. 使用 Promise 实现异步编程

  Promise 是 JavaScript 中实现异步操作的一种机制,它表示一个可能还未完成的操作(但未来某个时刻会完成),并允许你通过 .then() 和 .catch() 方法来处理操作的结果或错误。

  Promise 的基本用法:

  一个 Promise 对象有三种状态:

  Pending(待定): 初始状态,操作还没有完成。

  Fulfilled(已完成): 操作完成,且返回结果。

  Rejected(已拒绝): 操作失败,返回错误信息。

  创建一个 Promise

  javascriptCopy Codeconst promise = new Promise((resolve, reject) => {

  let success = true;

  if (success) {

  resolve('操作成功');

  } else {

  reject('操作失败');

  }

  });

  resolve(value):表示异步操作成功并返回结果。

  reject(error):表示异步操作失败并返回错误。

  处理 Promise 的结果

  使用 .then() 和 .catch() 来处理异步操作的结果。

  javascriptCopy Codepromise

  .then((result) => {

  console.log(result); // 如果 Promise 被 resolve,输出 "操作成功"

  })

  .catch((error) => {

  console.log(error); // 如果 Promise 被 reject,输出 "操作失败"

  });

  链式调用

  Promise 支持链式调用,这样可以依次处理多个异步操作。

  javascriptCopy Codeconst fetchData = new Promise((resolve, reject) => {

  setTimeout(() => {

  resolve('数据获取成功');

  }, 2000);

  });

  fetchData

  .then((data) => {

  console.log(data); // 输出 "数据获取成功"

  return '处理数据';

  })

  .then((processedData) => {

  console.log(processedData); // 输出 "处理数据"

  })

  .catch((error) => {

  console.error('出错了:', error);

  });

  Promise.all 和 Promise.race

  Promise.all():接受一个数组的 Promise,当所有 Promise 都成功时,返回一个包含所有结果的数组;如果有任何一个 Promise 失败,它会立刻返回失败。

  javascriptCopy Codeconst promise1 = Promise.resolve('结果1');

  const promise2 = Promise.resolve('结果2');

  Promise.all([promise1, promise2])

  .then(([result1, result2]) => {

  console.log(result1, result2); // 输出 "结果1 结果2"

  })

  .catch((error) => {

  console.error(error);

  });

  Promise.race():接受一个数组的 Promise,返回最先完成的那个 Promise 的结果。

  javascriptCopy Codeconst promise1 = new Promise((resolve, reject) => setTimeout(resolve, 100, '结果1'));

  const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 200, '结果2'));

  Promise.race([promise1, promise2])

  .then((result) => {

  console.log(result); // 输出 "结果1"

  })

  .catch((error) => {

  console.error(error);

  });

云服务器4.png

  2. 使用 async/await 实现异步编程

  async/await 是 JavaScript 在 ES8(ECMAScript 2017)中引入的一种语法糖,它基于 Promise 实现,但提供了一种更加简洁和直观的方式来编写异步代码。

  async 函数

  async 用于声明一个函数,表示该函数内部可能包含异步操作,并返回一个 Promise。

  async 函数始终返回一个 Promise,即使函数内部没有显式返回 Promise,它也会自动封装成一个 Promise。

  javascriptCopy Codeasync function myAsyncFunction() {

  return 'Hello, world!';

  }

  myAsyncFunction().then((result) => console.log(result)); // 输出 "Hello, world!"

  await 关键字

  await 只能在 async 函数内部使用。

  await 用来等待一个 Promise 解决(即执行完成),并返回结果。如果 Promise 被拒绝,则会抛出错误。

  javascriptCopy Codeasync function fetchData() {

  const response = await fetch('https://api.example.com/data');

  const data = await response.json();

  return data;

  }

  fetchData().then((data) => console.log(data)).catch((error) => console.error(error));

  async/await 异常处理

  使用 try...catch 来捕获和处理异步操作中的错误。

  javascriptCopy Codeasync function fetchData() {

  try {

  const response = await fetch('https://api.example.com/data');

  if (!response.ok) {

  throw new Error('请求失败');

  }

  const data = await response.json();

  return data;

  } catch (error) {

  console.error('发生错误:', error);

  }

  }

  async/await 与链式 Promise 的对比

  async/await 比 Promise 的 .then() 和 .catch() 更简洁,尤其是当有多个异步操作时,async/await 可以减少嵌套,提升代码的可读性。

  使用 Promise 的方式:

  javascriptCopy Codefunction getUserData(userId) {

  return getUser(userId)

  .then((user) => getPosts(user.id))

  .then((posts) => getComments(posts[0].id))

  .then((comments) => {

  console.log(comments);

  })

  .catch((error) => console.error(error));

  }

  使用 async/await 的方式:

  javascriptCopy Codeasync function getUserData(userId) {

  try {

  const user = await getUser(userId);

  const posts = await getPosts(user.id);

  const comments = await getComments(posts[0].id);

  console.log(comments);

  } catch (error) {

  console.error(error);

  }

  }

  Promise 是 JavaScript 实现异步编程的基础,它通过 resolve 和 reject 来处理异步操作的成功和失败。

  async/await 是基于 Promise 的语法糖,它提供了更清晰、简洁的异步操作方式。async 函数返回一个 Promise,而 await 可以暂停函数的执行,直到 Promise 完成。

  两者都有其适用的场景,但 async/await 更加直观和易于管理,尤其是当有多个异步操作需要处理时,async/await 能显著提高代码的可读性。

 


猜你喜欢