MST

星途 面试题库

面试题:JavaScript中如何解决Node默认异步的回调地狱

在Node.js环境中,经常会遇到异步操作,例如读取文件等。当多个异步操作相互依赖,形成多层嵌套的回调函数,即回调地狱。请简述至少两种解决回调地狱的方法,并给出简单代码示例。
42.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

方法一:使用Promise

  1. 原理:Promise是一个代表异步操作最终完成(或失败)及其结果值的对象。通过将异步操作封装成Promise对象,利用then方法链式调用,可以避免回调地狱。
  2. 代码示例
const fs = require('fs');
const { promisify } = require('util');

// 将fs.readFile方法转化为Promise形式
const readFile = promisify(fs.readFile);

readFile('file1.txt', 'utf8')
 .then(data => {
      console.log('File1 content:', data);
      return readFile('file2.txt', 'utf8');
  })
 .then(data => {
      console.log('File2 content:', data);
      return readFile('file3.txt', 'utf8');
  })
 .then(data => {
      console.log('File3 content:', data);
  })
 .catch(err => {
      console.error('Error reading files:', err);
  });

方法二:使用async/await

  1. 原理async函数返回一个Promise对象,await关键字只能在async函数内部使用,它用于暂停async函数的执行,等待一个Promise解决,并返回其解决的值。这种方式使异步代码看起来更像同步代码,进一步优化了回调地狱问题。
  2. 代码示例
const fs = require('fs');
const { promisify } = require('util');

// 将fs.readFile方法转化为Promise形式
const readFile = promisify(fs.readFile);

async function readFiles() {
    try {
        const data1 = await readFile('file1.txt', 'utf8');
        console.log('File1 content:', data1);

        const data2 = await readFile('file2.txt', 'utf8');
        console.log('File2 content:', data2);

        const data3 = await readFile('file3.txt', 'utf8');
        console.log('File3 content:', data3);
    } catch (err) {
        console.error('Error reading files:', err);
    }
}

readFiles();