В приведенном ниже примере функция 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());