Получить предыдущее значение из функции генератора - PullRequest
0 голосов
/ 28 сентября 2019

Я относительно новичок в функциях генератора и мне было интересно, есть ли способ получить предыдущее значение, полученное из функции генератора.Я знаю, что могу использовать .next() для перехода к следующему yield, но мне интересно, можно ли было бы сделать что-то вроде .prev(), что по сути вернулось бы на шаг.

Iнадеялся, что .prev() сработает, но, к сожалению, это не так:

const array = ['a', 'b', 'c'];

function* f(array) {
  let i = 0;
  while(true) {
    yield array[i];
    i = (i+1) % array.length;
  }
}

const seq = f(array);
console.log(seq.next().value); // a
console.log(seq.next().value); // b
console.log(seq.next().value); // c

console.log(seq.next().value); // a

// console.log(seq.prev().value); // c <-- expect 'c'

Как я уже говорил, я неопытен с генераторами, и если есть лучшая структура данных / метод для постепенного получения значений (предыдущий и следующий), я открытуслышать об этих предложениях

1 Ответ

0 голосов
/ 28 сентября 2019

Генератор может проверить результат yield, и, если это определенное выражение (например, 'prev'), уменьшите i вместо его увеличения:

const array = ['a', 'b', 'c'];

function* f(array) {
  let i = 0;
  while (true) {
    const incOrDec = (yield array[i]) === 'prev' ? -1 : 1;
    i = (array.length + i + incOrDec) % array.length;
  }
}

const seq = f(array);
console.log(seq.next().value); // a
console.log(seq.next().value); // b
console.log(seq.next().value); // c

console.log(seq.next().value); // a

console.log(seq.next('prev').value); // c <-- expect 'c'

Если вы не встраиваете функциональность в генератор, вам придется явно сохранить результат предыдущей итерации в переменной, а затем проверить его.Там нет встроенного метода, как .prev.

Я неопытный с генераторами, и если есть лучшая структура данных / метод для постепенного получения значений (предыдущий и следующий), яоткрыто для того, чтобы услышать об этих предложениях

Если у вас нет для работы с генератором, и ваша цель состоит в том, чтобы иметь возможность перебирать вперед и назад, тогда не,Если вы начинаете с генератора (например, с внешней функцией, которой вы не можете управлять), то вы можете использовать метод, аналогичный приведенному выше, для преобразования генератора в метод, который может перемещаться вперед и назад.В противном случае просто используйте простой массив, в который вы помещаете значения, и ищите индикаторы, например:

const array = ['a', 'b', 'c'];

function* f(array) {
  let i = 0;
  while (true) {
    const incOrDec = (yield array[i]) === 'prev' ? -1 : 1;
    i = (array.length + i + incOrDec) % array.length;
  }
}

const cache = [];
const getValue = i => cache[i] || (cache[i] = /* put logic for retrieving value here */ array[i % array.length]);

console.log(getValue(0));
console.log(getValue(1));
console.log(getValue(2));
console.log(getValue(3));
console.log(getValue(4));
console.log(getValue(3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...