MST

星途 面试题库

面试题:Node.js中async/await与Promise的关系及应用

请阐述Node.js中async/await与Promise的关系,并举例说明如何使用async/await处理多个异步操作,比如依次读取多个文件的内容。
45.9万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

async/await与Promise的关系

  1. 本质关系async/await是建立在Promise之上的语法糖。async函数始终返回一个Promise对象,如果async函数的返回值不是一个Promise,JavaScript会自动将其包装成一个已解决状态的Promiseawait只能在async函数内部使用,它用于暂停async函数的执行,直到其等待的Promise被解决(resolved)或被拒绝(rejected)。
  2. 优势对比Promise通过链式调用(.then())来处理异步操作,虽然解决了回调地狱问题,但链式调用过长时代码可读性可能下降。而async/await让异步代码看起来更像同步代码,大大提高了代码的可读性和可维护性。

示例:依次读取多个文件的内容

在Node.js中,可以使用fs/promises模块来处理文件操作,该模块提供了基于Promise的文件系统操作方法。以下是使用async/await依次读取多个文件内容的示例:

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

async function readFilesInSequence(filePaths) {
    let result = '';
    for (const filePath of filePaths) {
        try {
            const data = await fs.readFile(filePath, 'utf8');
            result += data + '\n';
        } catch (error) {
            console.error(`Error reading file ${filePath}:`, error);
        }
    }
    return result;
}

// 使用示例
const filePaths = ['file1.txt', 'file2.txt', 'file3.txt'];
readFilesInSequence(filePaths)
   .then(content => {
        console.log('All files content:', content);
    })
   .catch(error => {
        console.error('An error occurred:', error);
    });

在上述代码中:

  1. 首先引入了fs/promises模块,该模块提供了readFile等基于Promise的文件操作方法。
  2. 定义了readFilesInSequence异步函数,它接收一个文件路径数组filePaths
  3. 使用for...of循环遍历文件路径数组,在每次循环中使用await等待fs.readFile操作完成,该操作返回一个Promise。如果读取成功,将文件内容追加到result变量中;如果读取失败,捕获错误并打印。
  4. 最后调用readFilesInSequence函数并处理其返回的Promise,成功时打印所有文件的内容,失败时打印错误信息。