> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e1-iteration/03-closeable-iterators.md).

# 03. Closeable Iterator

Помимо метода `next()` итератор может иметь опциональный метод `return()`. Метод `return?(value? : any)` - заставляет итератор завершиться раньше положенного срока и сбросить свое состояние. Если итератор имеет метод `return`, то он называется *закрываемым* (closeable).

Работа итератора может завершиться преждевременно по следующим причинам:

* В цикле `for-of` имеются вызовы `break`, `return`, `continue`
* Выброс исключения или `throw`.
* Явный программный вызов `return()` на итераторе.

Правила работы `return`:

* Вызов `return` должен сбрасывать состояние итератора и освобождать используемые им ресурсы.
* Вызов `return()` должен возвращать `{done: true}`,
* Вызов `return(x)` в нормальном режиме должен возвращать объект `{ done: true, value: x }`.
* Метод `return` обязан возвращать объект, иначе будет выброшено исключение.
* На деле вызов `return` не обязан возвращать `done: true`, а может продолжать итерацию и дальше.

```javascript
function readLinesSync(fileName) {
    const file = ···;
    return {
        ···
        next() {
            if (file.isAtEndOfFile()) {
                file.close();
                return { done: true };
            }
            ···
        },
        return() {
            file.close();
            return { done: true };
        },
    };
}
```

Особенности использования `.return()`

* `.return()` вызывается если работа итератора должна завершиться преждевременно, до окончания итерации (исключение или `break`).
* `.return()` чисто опциональный метод, не все итераторы имеют его. Итераторы на массивах не имеют.
* `.return()` method is optional: JS built-in constructs will not call `.return()` on an iterator that doesn’t implement `.return()`.
* Основное назначение метода `return` состоит в очистке ресурсов.
* Babel вызывает этот метод если итератор не выполнился нормально (не дошел до `done: true`) и если на итераторе определен метод `return`.
* Метод `.return()` вызывается даже если выполняется destructing.
