面试题答案
一键面试async/await与Promise的关系
- 本质关系:
async/await
是建立在Promise
之上的语法糖。async
函数始终返回一个Promise
对象,如果async
函数的返回值不是一个Promise
,JavaScript会自动将其包装成一个已解决状态的Promise
。await
只能在async
函数内部使用,它用于暂停async
函数的执行,直到其等待的Promise
被解决(resolved)或被拒绝(rejected)。 - 优势对比:
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);
});
在上述代码中:
- 首先引入了
fs/promises
模块,该模块提供了readFile
等基于Promise
的文件操作方法。 - 定义了
readFilesInSequence
异步函数,它接收一个文件路径数组filePaths
。 - 使用
for...of
循环遍历文件路径数组,在每次循环中使用await
等待fs.readFile
操作完成,该操作返回一个Promise
。如果读取成功,将文件内容追加到result
变量中;如果读取失败,捕获错误并打印。 - 最后调用
readFilesInSequence
函数并处理其返回的Promise
,成功时打印所有文件的内容,失败时打印错误信息。