.then 与 await 的区别

1,556 阅读4分钟

.thenawait 是 JavaScript 中用于处理异步操作的两种不同的语法。

.then 是 Promise 的一种语法,用于处理异步操作的结果。当一个 Promise 完成(或拒绝)时,你可以通过 .then 方法链式地添加回调函数来处理结果。这种方式被称为基于回调的异步编程,它在早期 JavaScript 中被广泛使用。

function getData() {
  return fetch('https://api.example.com/data')
    .then((response) => response.json())
    .then((data) => {
      console.log(data);
    })
    .catch((error) => {
      console.error(error);
    });
}

await 是 ES2017 引入的关键字,用于在异步函数内等待一个 Promise 对象的解决(或拒绝)。使用 await 关键字可以使异步代码的书写方式更接近同步代码的样式,使代码更易读和维护。

.then 是在 Promise 出现之前就存在的异步编程方式,而 await 是为了简化异步操作的编写而引入的新语法。

在使用 .then 的旧式异步编程方式中,回调函数可能会形成回调地狱(callback hell),即多个嵌套的回调函数使代码难以阅读和理解。而使用 await 可以通过使用 async/await 语法来避免回调地狱,使异步代码的书写更加直观和清晰。

async function getData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

在使用 await 时需要将其放置在异步函数内部,该函数需要使用 async 关键字进行声明。

需要注意的是,await 只能在异步函数内部使用,而 .then 可以在任何地方使用。

区别:

  • 语法结构不同:.then 是通过方法链式调用的方式处理 Promise 的结果,而 await 是在异步函数内使用的关键字。

  • 代码风格不同:.then 的风格更接近于基于回调的异步编程,需要通过嵌套的回调函数来处理多个异步操作。而 await 的风格更接近于同步代码,通过按顺序编写异步操作来实现代码的流程控制。

  • 错误处理方式不同:.then 使用 .catch 方法来捕获 Promise 的拒绝(reject)结果,而 await 使用 try/catch 块来捕获异步操作中的错误。

  • 错误处理的范围不同:.then 可以在每个 Promise 链中的回调函数中独立处理错误,而 await 只能在包含 await 的异步函数内部进行错误处理。

  • 执行顺序不同:.then 中的回调函数会在 Promise 完成后按顺序执行,而 await 会暂停当前函数的执行,直到等待的 Promise 解决或拒绝。

总体来说,await 更具可读性和可维护性,因为它允许开发者使用更直观的同步风格编写异步代码,而不需要嵌套的回调函数。然而,.then 仍然是一个有用的工具,特别是在需要对每个 Promise 的结果进行不同处理的情况下。

并不是所有情况都适合使用 await。

例如,在并行执行多个异步操作时,.then 的方法链可能更加适用。根据具体的使用场景和需求,选择合适的语法来处理异步操作。

使用 .then 是合适的情况包括:

  • 需要并行执行多个异步操作:如果你有多个独立的异步操作,可以使用 .then 的方法链来并行执行它们,而不需要等待前一个操作完成。

  • 需要对每个异步操作的结果进行不同处理:如果每个异步操作的结果需要进行不同的处理,或者需要根据前一个操作的结果来决定下一个操作,.then 提供了灵活性来逐步处理异步操作的结果。

  • 需要更细粒度的错误处理:.then 允许你在每个回调函数中单独处理错误,可以根据具体情况进行错误处理或重试操作。

使用 await 是合适的情况包括:

  • 需要按顺序执行异步操作:如果需要确保异步操作按照特定顺序依次执行,await 提供了更直观和同步的代码结构。

  • 需要减少嵌套和回调地狱:如果存在多层嵌套的异步操作,使用 await 可以减少回调函数的嵌套,使代码更易读和维护。

  • 需要更简洁的错误处理:await 可以使用 try/catch 块来捕获和处理异步操作中的错误,使错误处理的代码更加简洁和集中。

关于 .thenawait 的更多详细信息和用法可以参考以下链接: