You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单例模式中的普通函数转换为async/await函数?

同步单例转async/await异步版本

原同步单例的核心是确保全局唯一实例,如果你的单例初始化逻辑是异步的(比如从后端拉取配置、读取本地文件),就需要把它改成异步版本。下面是改造后的代码:

const Singleton = (function () {
    let instancePromise; // 保存实例的Promise,确保只初始化一次

    async function createInstance() {
        // 模拟异步初始化操作,比如API请求、定时器
        await new Promise(resolve => setTimeout(resolve, 1000));
        return new Object("I am the async instance");
    }

    return {
        async getInstance() {
            if (!instancePromise) {
                instancePromise = createInstance();
            }
            return instancePromise; // 返回同一个Promise,await后得到唯一实例
        }
    };
})();

async function run() {
    const instance1 = await Singleton.getInstance();
    const instance2 = await Singleton.getInstance();

    console.log("Same instance? " + (instance1 === instance2)); // 输出true
}

run();

关键说明:

  • 把createInstance改成async函数,里面可以写入任何异步逻辑(比如await API调用、文件读取)
  • 用instancePromise存储初始化的Promise,而非直接存实例——这样即使多次调用getInstance,也只会触发一次异步初始化流程
  • getInstance本身是async函数,调用时必须用await获取最终实例
  • 多次await同一个Promise,最终得到的是同一个实例,完全保留单例特性

内容的提问来源于stack exchange,提问作者user3856437

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:30:49