回调地狱
fs.readFile('a.txt', (err, data1) => {
fs.readFile('b.txt', (err, data2) => {
fs.readFile('c.txt', (err, data3) => {
// 多层嵌套,难以维护
});
});
});Promise 链式调用
function readFilePromise(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) reject(err);
else resolve(data);
});
});
}
readFilePromise('a.txt')
.then(data => readFilePromise('b.txt'))
.then(data => readFilePromise('c.txt'))
.catch(err => console.error(err));async/await(终极方案)
async function readAll() {
try {
const data1 = await readFilePromise('a.txt');
const data2 = await readFilePromise('b.txt');
const data3 = await readFilePromise('c.txt');
return [data1, data2, data3];
} catch (err) {
console.error('读取失败:', err);
}
}并发执行
const [result1, result2] = await Promise.all([
fetch(url1),
fetch(url2)
]);现代 JavaScript 异步编程首选 async/await,代码如同同步般清晰。
