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。谢谢,它解决了问题!谢谢,它解决了这个问题!