Функция генератора необходима, когда состояние не имеет значения? - PullRequest
0 голосов
/ 29 июня 2018

В приведенном ниже примере функция generator используется для создания уникального идентификатора.

Фрагмент кода взят из следующего среднего поста: Источник

function* UUIDGenerator() {
  let d, r;
  while (true) {
    yield 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      r = (new Date().getTime() + Math.random() * 16) % 16 | 0;
      d = Math.floor(d / 16);
      return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
  }
};

let myGen = UUIDGenerator();

console.log(myGen.next());

ВОПРОС 1

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

ВОПРОС 2

Iterables (например, generators) нужны только тогда, когда нам нужно iterator object для того, чтобы перебрать последовательность, запоминая состояние между каждым вызовом? Если нам не нужно запоминать состояние, iterable не нужно, верно?

ВОПРОС 3

Дополнительный вопрос: ESLint жалуется при использовании функций внутри циклов. Такая картина очень типична для generators, как видно. Как это чаще всего решается?

function UUIDGenerator() {
  let d, r;
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    let r = (new Date().getTime() + Math.random() * 16) % 16 | 0;
    let d = Math.floor(d / 16);
    return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
  });
};

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