NodeJS教程

Promise 和 async/await

Preview
  • Node.js 异步编程的 Promise 和 async/await
  • Promise
  • async/await
  • Promise 和 async/await 的区别

Node.js 异步编程的 Promise 和 async/await

Promise

Promise 是一种表示异步操作的对象,它可以用来处理异步操作的结果。Promise 对象有三个状态:

  • pending:初始状态,表示异步操作还未完成;
  • fulfilled:表示异步操作成功完成;
  • rejected:表示异步操作失败。

Promise 对象有两个重要的方法:

  • then 方法:用于处理异步操作成功完成的结果;
  • catch 方法:用于处理异步操作失败的结果。

下面是一个使用 Promise 的例子:

const fs = require('fs').promises;

fs.readFile('file.txt')
  .then(data => console.log(data.toString()))
  .catch(err => console.error(err));

在上面的例子中,我们使用 fs.promises.readFile 函数读取一个文件。当读取操作完成后,我们使用 then 方法处理读取操作的结果。如果读取操作失败,我们使用 catch 方法处理错误。

在 Promise 中,我们可以使用 then 方法链式调用多个异步操作。下面是一个链式调用的例子:

const fs = require('fs').promises;

fs.readFile('file1.txt')
  .then(data1 => fs.readFile('file2.txt'))
  .then(data2 => console.log(data2.toString()))
  .catch(err => console.error(err));

在上面的例子中,我们首先使用 fs.promises.readFile 函数读取 file1.txt 文件。当读取操作完成后,我们使用 then 方法继续读取 file2.txt 文件。当读取操作完成后,我们使用 then 方法处理读取操作的结果。如果在异步操作中发生错误,我们使用 catch 方法处理错误。

async/await

async/await 是基于 Promise 对象的语法糖,它可以让我们像同步代码一样编写异步代码。async/await 可以让我们避免回调地狱的问题,以及简化 Promise 的链式调用。

async/await 由两个关键字组成:

  • async:用于标记一个函数是异步函数;
  • await:用于等待异步操作的结果。

下面是一个使用 async/await 的例子:

const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('file.txt');
    console.log(data.toString());
  } catch (err) {
    console.error(err);
  }
}
readFile();

在上面的例子中,我们首先定义了一个 readFile 函数。该函数使用 async 关键字标记,表示它是一个异步函数。在函数内部,我们使用 await 关键字来等待异步操作的结果。当异步操作完成后,我们打印读取操作的结果。如果在异步操作中发生错误,我们使用 catch 块处理错误。

在 async/await 中,我们可以使用 try/catch 块来处理异步操作的结果。下面是一个链式调用的例子:

const fs = require('fs').promises;

async function readFile() {
  try {
    const data1 = await fs.readFile('file1.txt');
    const data2 = await fs.readFile('file2.txt');
    console.log(data1.toString() + data2.toString());
  } catch (err) {
    console.error(err);
  }
}
readFile();

在上面的例子中,我们首先定义了一个 readFile 函数。该函数使用 async 关键字标记,表示它是一个异步函数。在函数内部,我们使用 await 关键字来等待异步操作的结果。当异步操作完成后,我们将两个文件的内容合并,并打印它。如果在异步操作中发生错误,我们使用 catch 块处理错误。

Promise 和 async/await 的区别

Promise 和 async/await 都是用来处理异步操作的机制。它们的主要区别在于:

  • Promise 是基于回调函数的机制,async/await 是基于 Promise 的语法糖;
  • Promise 是链式调用的机制,async/await 是同步的机制;
  • Promise 需要使用 thencatch 方法来处理异步操作的结果,async/await 可以使用 try/catch 块来处理异步操作的结果。

总的来说,async/await 更加简单易用,而 Promise 更加灵活和可扩展。在实际开发中,我们可以根据具体的需求选择适合的机制。