Почему генератор не возвращает следующее значение? - PullRequest
2 голосов
/ 24 января 2020

При каждом вызове функции "l oop" я пытаюсь вернуть новое значение свойства "c" из объекта "test", но по какой-то причине я получаю одно и то же значение каждого вызов функции.

1 call: {value: {a: 1}, done: false}
2 call: {value: {a: 1}, executed: false}
3 call: {value: {a: 1}, done: false}

вместо получения нового значения для каждого вызова

1 call: {value: {a: 1}, done: false}
2 call: {value: {a: 2}, executed: false}
3 call: {value: {a: 3}, done: true}

const test = {
  a: { id: 1 },
  b: { id: 2 },
  c: [{ a: 1 }, { a: 2 }, { c: 3 }]
};

function* generLoop(elem) {
  // eslint-disable-next-line no-undef,no-restricted-syntax
  for (el of test[elem]) {
    // eslint-disable-next-line no-undef
    yield el;
  }
}

const createLoop = elem => {
  const gen = generLoop(elem);
  return () => gen.next();
};

function loop(elem) {
  const findQuery = Object.keys(test).find(el => el === elem);
  if (findQuery) {
    const loopIterator = createLoop('c');
    loopIterator();
  }
  return test[elem];
}

for (let i = 0; i < 3; i++) {
  console.log(loop('c'));
}

Фактически, это симуляция логики c, которую я хочу реализовать. На самом деле, я имитирую ответ сервера, когда приходят имена запросов, я хочу дать определенный набор данных, но некоторые запросы будут приходить несколько раз и запрашивать ту же структуру данных, но с разными значениями, поэтому функция «l oop» будет вызываться независимо.

1 Ответ

3 голосов
/ 24 января 2020

Вы должны создать генератор только один раз, а затем вызвать next(), как вам нужно

cosnt createLoop = elem => {
  const findQuery = Object.keys(test).find(el => el === elem);
  let gen
  if (findQuery) {
    gen = generLoop('c');
  }
  return () => gen ? gen.next() : test[elem];
}

const iterator = createLoop('c')
for (let i = 0; i < 3; i++) {
  console.log(iterator());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...