В разработке программного обеспечения во многих случаях мы сохраняем обработчик или дескриптор, чтобы отменить операцию или закрыть ресурс. Возможно, наиболее знакомым примером является сохранение объекта тайм-аута, возвращаемого функцией setTimeout, для его очистки.

Начнем с примера. Где-то в моем коде я создал ловушку тайм-аута:

Ловушка выдаст исключение через 5 секунд. Позже, если мой процесс прошел успешно, и я хочу отменить ловушку, мне нужно:

  1. Доступ к объекту timer
  2. Реализовать отмену

В то время как первое требование в основном является обязательным, второе требует знаний о создании таймера и, следовательно, связи.

Чтобы устранить эту связь, функция, создающая побочный эффект, должна возвращать обработчик отмены.

Рассмотрим следующую функцию тайм-аута:

Эта реализация создает таймер и функцию отмены в одном контексте. Для отмены тайм-аута, созданного этой функцией, требуется не более чем вызов функции.

Давайте посмотрим на пример «реального мира» для этого таймера:

Другое использование функций отмены — изящное завершение приложений. Мы можем использовать ту же концепцию для любого ресурса, который необходимо «отменить» (закрытие обработчика файлов, закрытие соединения с базой данных и т. д.).