Javascript 带有js的singleton导致内存泄漏

Javascript 带有js的singleton导致内存泄漏,javascript,google-chrome-extension,memory-leaks,infinite-loop,Javascript,Google Chrome Extension,Memory Leaks,Infinite Loop,我正在开发一个chrome扩展,我希望config对象只创建一次,并在应用程序的所有部分之间共享。 第二个对象(取决于配置)也应该创建一次并共享。 每个对象都包含承诺 函数配置(){ this.instance=null; this.status='pending'; this.data=defaultdata; //承包商 this.init=async()=>{ 如果(this.instance)返回this.instance; this.instance=this; 等待此消息。loadD

我正在开发一个chrome扩展,我希望config对象只创建一次,并在应用程序的所有部分之间共享。 第二个对象(取决于配置)也应该创建一次并共享。 每个对象都包含承诺

函数配置(){
this.instance=null;
this.status='pending';
this.data=defaultdata;
//承包商
this.init=async()=>{
如果(this.instance)返回this.instance;
this.instance=this;
等待此消息。loadData();
}
this.loadData=async()=>{//从chrome存储中获取数据}
}
第二个对象如下所示:


函数网站类(配置){
this.instance=null;
this.status='pending';
this.data=config.data.userProfile;
//承包商
this.init=async()=>{
如果(this.instance)返回this.instance;
this.instance=this;
等待this.loadAnotherData(this.data);
}
this.loadAnotherData=async()=>{//从chrome存储区获取数据;}
}
然后在一个文件中实例化两个对象:


//init.js
const configObj=new Config();
export const hudconfignit=()=>{
如果(configObj.instance)返回configObj;
configObj.init();
返回configObj;
}
export const hudConfig=hudConfigInit();
const websitesObj=新网站类(hudConfig);
const hudWebsitesObjInit=()=>{
websitesObj.init();
返回网站sobj;
}
export const hudWebsites=hudWebsitesObjInit();
然后,我将创建的对象导入到我的所有文件中,如:


从'init.js'导入{hudConfig,hudWbsites};
window.inload=async()=>{
等待等待等待([hudConfig,hudconfit]);
//在这里开始工作。。。
}
问题是我在这个实现中遇到了一个奇怪的无限循环

我做错了什么?有什么建议吗

编辑 我使用此函数来确保正确加载每个函数:

/**
*@summary在单个对象完成加载时检测。
*@param{object}obj我们正在等待的对象
*@在对象完成加载时返回{boolean}true
*/
const finishWorking=async(obj)=>{
if(helpers.isFunction(对象刷新)){
开关(obj.型){
case HUD_OBJECT_TYPES.hudConfig:{await hudConfig.refresh();break;}
case HUD_OBJECT_TYPES.hudWebsites:{wait hudWebsites.refresh(hudConfig);break;}
//case HUD_OBJECT_TYPES.hudSubscriptions:{await hudSubscriptions.refresh(hudConfig);break;}
}
}
返回新承诺(异步(解析、拒绝)=>{
while(obj.status!==workStatus.done){
等待帮助者。睡眠(1000);
//精加工(obj)
/**->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>无限循环在此**/
}
决心(正确);
})
}

因为它是一个chrome扩展:

  • 在弹出窗口和选项页面之间共享对象引用将为它们中的每一个创建一个副本,因为它们都是一个单独的文档
  • 尝试在后台和其他组件之间共享对象引用将导致错误,因为不允许这种共享
  • 解决办法是:

  • 在最上面的背景页面上实例化对象
  • 使用chrome.runtime.sendMessage()函数与该对象交互,发送正确的消息并将响应定向到正确的对象方法
  • 因此:

    //background.js
    const configObj=new Config();
    chrome.runtime.onMessage(异步(请求、发送方、发送响应)=>{
    开关(请求类型){
    案例“refreshConfig”:{
    等待hudConfig.refresh();
    sendResponse(hudConfig.data);
    }
    }
    })
    
    您还可以通过弹出窗口或选项或内容发送消息,如下所示:

    
    const refreshButton=document.querySelector(“#save”);
    refreshButton.onClick(异步()=>{
    chrome.runtime.sendMessage({type:“refreshConfig”},(数据)=>{
    setData(data);//这里的数据是更新后的对象。
    })
    })
    
    “我在某处面临一个奇怪的无限循环”-你能更准确地解释一下吗?是什么让你假设有一个无限循环,你观察到了什么?调试器说什么,它在这个循环中暂停在哪里?这与内存泄漏有什么关系呢?看起来您混合了三种不同的方法来实现一个单例。去掉所有的
    .instance
    .instance
    代码,你的init.js模块只为每个类创建一个实例。你为什么要导出
    hudconfignit
    ?我不导出init,只导出对象,我想我对init()中的承诺过于谨慎了。我会清理实例,这真的不必要