面试题答案
一键面试- 使用 Promise 的错误处理:
- 单个异步操作:
- 在 Node.js 中,许多异步操作可以用 Promise 包装。例如读取文件操作,Node.js 原生的
fs.readFile
是基于回调的,我们可以将其包装成 Promise。
const fs = require('fs'); const { promisify } = require('util'); const readFile = promisify(fs.readFile); readFile('nonexistentfile.txt', 'utf8') .then(data => { console.log(data); }) .catch(err => { console.error('读取文件失败:', err); // 这里可以进行状态恢复操作,比如记录日志,尝试其他文件读取路径等 });
- 在 Node.js 中,许多异步操作可以用 Promise 包装。例如读取文件操作,Node.js 原生的
- 多个异步操作并发执行:
- 使用
Promise.all
来处理多个异步任务并发执行。假设我们有多个文件读取任务。
const fs = require('fs'); const { promisify } = require('util'); const readFile = promisify(fs.readFile); const filePaths = ['file1.txt', 'nonexistentfile.txt', 'file3.txt']; const promises = filePaths.map(path => readFile(path, 'utf8')); Promise.all(promises) .then(data => { console.log('所有文件读取成功:', data); }) .catch(err => { console.error('其中一个文件读取失败:', err); // 进行状态恢复,比如记录失败的文件路径,尝试重新读取等 });
- 使用
- 单个异步操作:
- 使用 async/await 的错误处理:
- 单个异步操作:
const fs = require('fs'); const { promisify } = require('util'); const readFile = promisify(fs.readFile); async function readSingleFile() { try { const data = await readFile('nonexistentfile.txt', 'utf8'); console.log(data); } catch (err) { console.error('读取文件失败:', err); // 进行状态恢复操作 } } readSingleFile();
- 多个异步操作并发执行:
const fs = require('fs'); const { promisify } = require('util'); const readFile = promisify(fs.readFile); async function readMultipleFiles() { const filePaths = ['file1.txt', 'nonexistentfile.txt', 'file3.txt']; const promises = filePaths.map(path => readFile(path, 'utf8')); try { const data = await Promise.all(promises); console.log('所有文件读取成功:', data); } catch (err) { console.error('其中一个文件读取失败:', err); // 进行状态恢复操作 } } readMultipleFiles();
- 单个异步操作:
通过 try - catch
块(在 async/await
中)或者 .catch
方法(在 Promise 链中),我们可以捕获异步操作中的错误,并进行相应的错误处理和状态恢复。在状态恢复时,可以根据具体业务需求,例如记录错误日志、尝试重试操作、回滚部分操作等。