方法一:使用Promise
- 原理:Promise是一个代表异步操作最终完成(或失败)及其结果值的对象。通过将异步操作封装成Promise对象,利用
then
方法链式调用,可以避免回调地狱。
- 代码示例:
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
- 原理:
async
函数返回一个Promise对象,await
关键字只能在async
函数内部使用,它用于暂停async
函数的执行,等待一个Promise解决,并返回其解决的值。这种方式使异步代码看起来更像同步代码,进一步优化了回调地狱问题。
- 代码示例:
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();