@aarifkhamdi

Можно ли повторно использовать asyncIterator в JavaScript?

Имеется следующий фрагмент кода. Подскажите, пожалуйста, он обречен на неудачу или я чего-то не догоняю?

Меня смущает повторное использование точно того же итератора в двух (for ... of ...). Можно ли так делать? Итератор ведь одноразовый, разве нет?

Можно ли это заставить работать?

PS: если заменить это
for await (const person of { [Symbol.asyncIterator]() { return iterator; } }) {
на это
for await (const person of target) {
, то все успешно отрабатывает.

меня интересует может ли это работать именно в таком виде, в каком мне это досталось
const iterator = target[Symbol.asyncIterator]();

const iterated = [];
for await (const person of { [Symbol.asyncIterator]() { return iterator; } }) {
    iterated.push(person);
}

t.same(iterated, [],
    'iterates sucessfully over empty collection');

const toAdd = [1, 2, 3];
await target.addToTarget(toAdd);

for await (const person of { [Symbol.asyncIterator]() { return iterator; } }) {
    iterated.push(person);
}

t.same(iterated, toAdd,
    'iterates sucessfully after adding to collection (iterator does not invalidate)');
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
почему одноразовый? https://jsfiddle.net/melchiorio/oz12tg3k/
Не понимаю смысла создавать пустой объект с итератором от другого объекта. Итератор создает в объекте какие-то свойства? Если да, то почему они не используются в дальнейшем, если нет, то зачем эти данные помещать в свойства?

upd:
Воспроизвел ваш пример https://jsfiddle.net/melchiorio/n5awv1bd/1/, похоже такой хитрый способ сделан чтобы иметь как раз одноразовый итератор, добавляя элементы через addToTarget и запуская его вновь он проходит только по новым значениям видимо.
А у вас работает одинаково, потому что первый запуск пустой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы