Каталог
Веб-разработка с нуля: четыре курса по порядку.
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Каталог
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Урок 98 из 114 · 11 мин
Объявления using и await using, Symbol.dispose и Symbol.asyncDispose, DisposableStack, AsyncDisposableStack и SuppressedError.
Открыл принтер, а закрыть забыл. Через час принтер занят навсегда! Хе-хе.
using закрывает ресурс сам при выходе из блока — даже если внутри случилась ошибка.
Symbol.dispose · Symbol.asyncDispose[Symbol.dispose]() (или асинхронный [Symbol.asyncDispose]()), который его закрывает.const printer = { [Symbol.dispose]() { console.log("Принтер закрыт"); } };
printer[Symbol.dispose]();usingusing r = open(); — в конце блока автоматически вызывается r[Symbol.dispose](), в обратном порядке объявления.function open(name) {
console.log("Открыт", name);
return { [Symbol.dispose]() { console.log("Закрыт", name); } };
}
{
using a = open("принтер");
using b = open("касса");
console.log("Печатаем чек");
}await usingawait using r = … — в конце блока ждёт await r[Symbol.asyncDispose]().async function main() {
{
await using conn = { async [Symbol.asyncDispose]() { await wait(50); console.log("Соединение закрыто"); } };
console.log("Работаем");
}
console.log("После блока");
}
await main();DisposableStackstack.use(r) — добавить ресурс, defer(fn) — добавить действие уборки, adopt(value, fn) — значение со своей функцией освобождения, move() — передать стопку, dispose() — освободить всё; disposed — освобождена ли.const stack = new DisposableStack();
stack.defer(() => console.log("уборка 1"));
stack.adopt("файл", (f) => console.log("закрыт", f));
const moved = stack.move();
console.log(stack.disposed);
moved.dispose();
console.log(moved.disposed);use() · dispose() · disposed · [Symbol.dispose]use(resource) регистрирует объект с Symbol.dispose; dispose() и [Symbol.dispose]() освобождают в обратном порядке; disposed — флаг.using.const stack = new DisposableStack();
stack.use({ [Symbol.dispose]() { console.log("ресурс освобождён"); } });
stack[Symbol.dispose]();
console.log(stack.disposed);AsyncDisposableStackuse, defer, adopt, move и disposeAsync(); флаг disposed.const s = new AsyncDisposableStack();
s.defer(async () => { await wait(20); console.log("асинхронная уборка"); });
await s.disposeAsync();
console.log(s.disposed);use() · adopt() · move()const s = new AsyncDisposableStack();
s.use({ async [Symbol.asyncDispose]() { console.log("закрыто"); } });
s.adopt(1, async () => console.log("adopt"));
await s.move().disposeAsync();SuppressedErrorSuppressedError: error — ошибка уборки, suppressed — исходная.try {
using r = { [Symbol.dispose]() { throw new Error("не закрылся"); } };
throw new Error("сбой работы");
} catch (e) {
console.log(e.name, e.error.message, "/", e.suppressed.message);
}Открыл — объяви через using. Тогда «забыл закрыть» становится невозможным.
Напиши openPrinter(log): возвращает объект с методом print(text) (пишет в log) и [Symbol.dispose]() (пишет "closed"). Функция printReceipt(log) должна открыть принтер через using, напечатать "чек" и закрыться сама.
using — пока нетВыберите один ответ.
Когда вызывается [Symbol.dispose]() у using-переменной?
Выберите один ответ.
В каком порядке освобождаются using a и потом using b?
Проверяем состояние обучения…