在下面的示例中,使用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());