Существуют ли случаи использования, когда вы вручную внедрили бы итератор? - PullRequest
2 голосов
/ 26 апреля 2020

iterator используется довольно часто, например, в операторе spread, for/of -l oop, в деконструкции и т. Д. c. Но они скрыты. Интересно, есть ли случаи использования, когда вы активно использовали бы знания о том, как реализовать итератор?

Например, итерация по массиву с использованием итератора является более сложной, как вы можете видеть ниже, и я бы не стал Не знаю, почему кто-то сам реализовал бы итератор:

function arrayIterable(arr = []) {
    let index = 0;
    const len = arr.length;

    const arrayIterator = {
       next: () => {
           let result;
           if (index === len) {
             return { value: arr[index], done: true };            
           }
           result = { value: arr[index], done: false }
           index++;
           return result;           
       }
    };
    return arrayIterator;
}
const myArr = ['a','b','c','d'];
let iter = arrayIterator(myArr);
let result = iter.next();
while (!result.done) {
  console.log(result.value);
  result = iter.next();
}

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

Это удобно, если вы хотите лениво работать с набором данных. Поток, файл, база данных, вы перемещаетесь из одной строки / записи в другую и продвигаете итератор. Нет необходимости хранить историю в памяти.

Поскольку вам не нужно хранить весь источник в памяти, вы также можете обрабатывать бесконечные источники данных.

Самый большой выигрыш итератор на стороне клиента. В коде эпохи перед итератором вам обычно предоставляется массивоподобный объект, который предоставляет индексирование. Однако в современном коде вам может быть предоставлен итератор, что означает, что клиент обрабатывает более общие результаты с тем же кодом. Консультируйтесь с обсуждением под этим вопросом для примера.

1 голос
/ 26 апреля 2020

Я не думаю, что знание о том, как это реализовано, использовалось бы для того, чтобы на самом деле перебирать вещи. В этом нет никакого преимущества перед использованием for для l oop.

Но предположим, что вы создаете библиотеку JavaScript, например драйвер Node.js для базы данных MongoDB. Вы хотите упростить запрос к базе данных и l oop по результатам. Вы реализуете итерируемый протокол , и тогда люди могут сделать это:

const cursor = queryDatabase(<some query>)
for (let doc of cursor) {
// do something with doc
}

На самом деле, Драйвер MongoDB действительно делает это (за исключением того, что они реализуют асинхронный доступ). c итератор).

РЕДАКТИРОВАТЬ: Обратите внимание на преимущество использования протокола итератора по сравнению с возвращением массива-подобного объекта из queryDatabase(). В частности, в MongoDB cursor не содержит всех результатов. Это дескриптор, и результаты запроса могут быть получены путем вызова cursor.next()

Проблема с необходимостью вызова cursor.next() заключается в том, что он довольно неуклюж, как вы указали в вопросе. Тем не менее, это хорошо, потому что не все результаты должны быть получены из базы данных, которых может быть тысячи. Таким образом, протокол итератора - это способ сохранить преимущества cursor.next() без необходимости иметь дело с уродливым синтаксисом.

0 голосов
/ 26 апреля 2020

Подробное введение в методы итератора можно найти в JavaScript для MDN:

См. MDN: протоколы итерации

Также содержит области применения, применения и примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...