如何将单例模式中的普通函数转换为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
相关产品推荐
相关产品推荐

