Javascript Map()对象中项目的生存期
我有一个带有Javascript Map()对象中项目的生存期,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我有一个带有background.js脚本的Chrome扩展(页面操作) 在background.js脚本中,我定义了一个Map对象,该对象仅在chrome.pageAction.onClicked侦听器中清除,该侦听器还向Map对象添加一个项目,并在打开一个窗口后立即: var docsInBatch = new Map(); chrome.pageAction.onClicked.addListener(function(tab) { docsInBatch.clear(); do
background.js
脚本的Chrome扩展(页面操作)
在background.js
脚本中,我定义了一个Map
对象,该对象仅在chrome.pageAction.onClicked
侦听器中清除,该侦听器还向Map
对象添加一个项目,并在打开一个窗口后立即:
var docsInBatch = new Map();
chrome.pageAction.onClicked.addListener(function(tab) {
docsInBatch.clear();
docsInBatch.set(doc.docid, { docid: doc.docid, fn: fileName, done: false });
window.open(THE_URL);
然后我等待加载带有chrome.tabs.onUpdate
侦听器的URL
chrome.tabs.onUpdated.addListener(function(tabId, info) {
if (info.status == 'complete') {
chrome.tabs.get(tabId, function(newTab) {
if ((newTab.url.lastIndexOf(THE_URL, 0) === 0) {
alert('docsInBatch.size=' + docsInBatch.size);
}
});
在这里,如果要在URL
加载的文档需要很长时间(Chrome甚至可能会问您是否希望等待或取消),我会得到docsInBatch.size==0
,这不应该是因为它必须至少有一个元素,即添加在Chrome.pageAction.onClicked
上的元素
这就像有人清除了Maps()对象中的对象(可能是垃圾收集器?)
为什么只有长时间运行的进程才会出现这种行为?如果垃圾收集器正在清除一段时间未使用的映射中的项目,有没有办法防止这种情况发生?我不知道为什么要清除
Map
对象,但您可以始终将该对象存储在窗口中。localStorage
。首先,您必须创建函数来将映射转换为字符串或从字符串转换为:
function mapToJson(map) {
return JSON.stringify([...map]);
}
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
资料来源:
然后将地图存储在本地存储器中:
window.localStorage.setItem("myMap", mapToJson(map));
要检索地图
:
var map = jsonToMap(window.localStorage.getItem("myMap"));
我不知道为什么要清除映射
对象,但您始终可以将该对象存储在窗口中。localStorage
。首先,您必须创建函数来将映射转换为字符串或从字符串转换为:
function mapToJson(map) {
return JSON.stringify([...map]);
}
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
资料来源:
然后将地图存储在本地存储器中:
window.localStorage.setItem("myMap", mapToJson(map));
要检索地图
:
var map = jsonToMap(window.localStorage.getItem("myMap"));
这是由后台清单部分中的persistent:false
引起的。当事件页没有主动执行某些操作时,它将被卸载,从而释放内存和其他系统资源
只需设置persistent:true
或将映射保存到chrome.storage.local,即可解决此问题
这是由后台清单部分中的持久:false
引起的。当事件页没有主动执行某些操作时,它将被卸载,从而释放内存和其他系统资源
只需设置persistent:true
或将映射保存到chrome.storage.local,即可解决此问题
您的清单中是否有persistent:false?是的,我的清单中有persistent:false。您的清单中是否有persistent:false?是的,我的清单中有persistent:false。谢谢,它解决了问题!谢谢,它解决了这个问题!