Я хочу кешировать объекты с высокой производительностью, используя шаблон Multiton в JavaScript с асинхронной функцией. Я привожу пример и хотел бы знать, правильно ли я это реализовал, то есть достаточно ли этого, чтобы гарантировать, что объект с одинаковым именем никогда не будет сгенерирован дважды, независимо от асинхронного порядка выполнения.
const things = new Map();
// in real life, fetch from network or other asynchronous, slow operation
async function slowFunc() {
return Math.floor(Math.random() * Math.floor(100));
}
class Thing {
constructor(n) {
this.n = n;
}
static async get(name) {
let thing = things.get(name);
if (thing) {
console.log("Reusing existing", name, "with n=", (await thing).n);
return thing;
}
const promise = slowFunc().then(n => {
thing = new Thing(n);
console.log("Creating new", name, "with n=", n);
return thing;
}, );
things.set(name, promise);
return promise;
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<button onclick="Thing.get('a');">Make an A</button>
<button onclick="Thing.get('b');">Make a B</button>
</body>
</html>