🤝 Promise.
Если вы работали со сложными асинхронными потоками, вам наверняка приходилось «вытаскивать» resolve и reject из конструктора промиса наружу.
Это называется Deferred Pattern. Раньше мы писали для этого такой бойлерплейт:
// 🐢 Старый способ (Verbose & Ugly)
let resolvePromise;
let rejectPromise;
const promise = new Promise((resolve, reject) => {
resolvePromise = resolve;
rejectPromise = reject;
});
// Теперь resolvePromise можно вызвать снаружи
Начиная с ES2024, в JavaScript появился официальный статический метод, который делает это одной строкой.
🚀 Новый стандарт:
const { promise, resolve, reject } = Promise.withResolvers();
Где это реально нужно?
Обычные промисы создаются и тут же выполняются внутри callback-а. Но иногда событие, завершающее промис, происходит совсем в другом месте кода.
Пример: Превращаем событие (Event) в Промис
Допустим, мы ждем, когда пользователь загрузит файл или нажмет кнопку в сокете.
function waitForMessage(socket) {
const { promise, resolve, reject } = Promise.withResolvers();
socket.on('message', (data) => {
resolve(data); // Резолвим промис из обработчика события
});
socket.on('error', (err) => {
reject(err);
});
return promise;
}
// Использование:
// const msg = await waitForMessage(ws);
👉 @frontend_1