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, а может продолжать итерацию и дальше.

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.

Last updated