Промисы (Promises) и обратные вызовы (callbacks) — два основных подхода для работы с асинхронным кодом в JavaScript. Рассмотрим их ключевые различия и практические последствия.
Колбэки (Callback Hell):
fs.readFile('file1.txt', (err, data1) => {
if (err) throw err;
fs.readFile('file2.txt', (err, data2) => {
if (err) throw err;
fs.writeFile('output.txt', data1 + data2, (err) => {
if (err) throw err;
console.log('Done');
});
});
});
Промисы (Chaining):
readFilePromise('file1.txt')
.then(data1 => readFilePromise('file2.txt'))
.then(data2 => writeFilePromise('output.txt', data1 + data2))
.then(() => console.log('Done'))
.catch(err => console.error(err));
.catch()
pending
, fulfilled
, rejected
Promise.all()
— параллельное выполнениеPromise.race()
— первая завершенная операцияPromise.allSettled()
— все операции с любым исходом.catch()
, ошибки могут быть "проглочены"let resolved = false;
Promise.resolve().then(() => { resolved = true });
console.log(resolved); // false (хотя промис уже resolved)
fs.readFile('config.json', (err, data) => {
if (err) return console.error(err);
initApp(JSON.parse(data));
});
socket.on('message', (msg) => {
console.log('Received:', msg);
});
Async/Await (надстройка над промисами):
async function processFiles() {
try {
const data1 = await readFilePromise('file1.txt');
const data2 = await readFilePromise('file2.txt');
await writeFilePromise('output.txt', data1 + data2);
console.log('Done');
} catch (err) {
console.error(err);
}
}
Промисы предоставляют более структурированный и удобный для поддержки подход к асинхронному коду, особенно для сложных сценариев. Колбэки остаются полезными для простых операций и событийно-ориентированных API. В современных приложениях оптимально использовать async/await поверх промисов для максимальной читаемости кода.