Асинхронный мультитонный шаблон в JavaScript? - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу кешировать объекты с высокой производительностью, используя шаблон 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>
...