TGViewer
Настоящий JavaScript Настоящий JavaScript @true_js · 5.89K subscribers
Post #3567 417
Promise.withResolvers() в production: ручное завершение промисов без deferred-антипаттернов и утечек

Promise.withResolvers() полезен на границе event-based API и async/await: WebSocket, Worker, IPC, SDK, API clients, Node.js-сервисы. Частая ошибка - считать его безопасной заменой любому deferred и хранить resolve/reject где попало.

Что это даёт
const { promise, resolve, reject } =
Promise.withResolvers<T>();


Это тот же внешний resolve/reject, но без let, definite assignment и самодельного executor-шаблона. API стал чище, но lifecycle всё ещё ваша ответственность.

Где применять
* ожидание одного события;
* bridge callback/event API в Promise;
* request/response поверх WebSocket, Worker или IPC;
* внутренняя очередь producer/consumer.

Не стоит передавать resolve через слои, класть его в глобальное состояние или создавать promise без timeout/cancel path.

Production-паттерн
type Message = { id: string; payload: unknown };

type Waiter = {
resolve: (m: Message) => void;
reject: (e: Error) => void;
timeout: ReturnType<typeof setTimeout>;
};

const pending = new Map<string, Waiter>();

function waitForMessage(id: string, ms = 5000) {
const { promise, resolve, reject } =
Promise.withResolvers<Message>();

const timeout = setTimeout(() => {
pending.delete(id);
reject(new Error(Message timeout: ${id}));
}, ms);

pending.set(id, { resolve, reject, timeout });

return promise.finally(() => {
clearTimeout(timeout);
pending.delete(id);
});
}


Что важно
У promise есть owner - waitForMessage(). Есть timeout, очистка через finally(), а resolve/reject не утекают наружу. Иначе Map будет удерживать замыкания, таймеры и payload.

Практический совет: если у вызывающего кода есть свой lifecycle, добавьте AbortSignal и снимайте listener в finally().

Вывод:
Promise.withResolvers() стоит использовать только там, где явно определены owner, timeout/cancel path и очистка ресурсов.
More from @true_js
  1. Oct 3, 2026Post #3963
  2. Oct 2, 2026😅 Айтишник отправил в одну компанию три одинаковых резюме и только одно дошло до финала О…
  3. Oct 2, 2026Post #3961
  4. Oct 2, 2026🤣 Правильно расставленные приоритеты в моей жизни би лайк: 💥 xCode Journal
  5. Oct 1, 2026🤯 Люди взбунтовались против «пыточной для ИИ» На GitHub заметили открытый проект AI Tortu…
  6. Oct 1, 2026День в Заонежье начинается ещё в дороге. Мы встретим вас в аэропорту или на вокзале. Дальш…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →