状态无关时需要生成器功能吗?

时间:2018-06-29 12:53:56

标签: javascript ecmascript-6 eslint iterable

在下面的示例中,使用generator函数来生成唯一ID。

该代码段来自以下中等职位:Source

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());

0 个答案:

没有答案