Javascript 带有js的singleton导致内存泄漏
我正在开发一个chrome扩展,我希望config对象只创建一次,并在应用程序的所有部分之间共享。 第二个对象(取决于配置)也应该创建一次并共享。 每个对象都包含承诺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
函数配置(){
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扩展:
//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()中的承诺过于谨慎了。我会清理实例,这真的不必要