【问题标题】:NS_ERROR_OUT_OF_MEMORY writing in localStorageNS_ERROR_OUT_OF_MEMORY 写入 localStorage
【发布时间】:2023-04-04 08:43:02
【问题描述】:

当我在 localStorage 中写入时,Firefox 中出现此异常的原因可能是什么?

这是写在localStorage中的函数:

try {
        localStorage[key] = JSON.stringify(data);
    } catch(e) {
     .... // CODE TU PRINT THE ERROR
    }

仅供参考,我将 Firefox 的 storageQuota 设置为一个高得离谱的数字,以便节省大量数据,因为我的默认值非常低。

如果有人可以提供帮助或需要更多信息,请发表评论或询问。 谢谢!

【问题讨论】:

  • 我认为您的问题与本地存储无关。您的数据可能具有导致 JSON 字符串爆炸的循环引用。如果您调用JSON.stringify(data) 而不将其写入本地存储会发生什么?它是否真的生成一个字符串,如果是,它有多大?
  • 这是我现在要保存的一个数据的长度:22392130,但现在例如没有发生异常。它只是有时发生,一旦发生一次,如果我不重新启动 Firefox,它就会在我每次执行该代码时发生。
  • 如果调用 JSON.stringify(data) 而不将其写入本地存储会发生什么?你曾经得到错误吗?
  • 我在 localStorage 中有时同时在两个选项卡中写入,可能是线程错误?
  • 你能先回答我问了两次的问题吗?为什么您会认为 OUT OF MEMORY ERROR 表示线程问题?

标签: javascript html local-storage


【解决方案1】:

您的问题根本不在于本地存储。 NS_ERROR_OUT_OF_MEMORY 表示您的内存不足。超出浏览器的本地存储配额将导致QUOTA_EXCEEDED_ERR(或等效)错误。

您遇到内存不足错误,因为您的 JSON.stringify(...) 调用太大而无法放入内存。

你可以

  • a) 将您的对象分成更小的部分,并分别对每个部分进行字符串化。仅此一项可能不足以解决您的问题。这取决于您的 JSON 为何如此庞大。
  • b) 使用带有 replacer 参数的 JSON.stringify(...) 重载。请参阅文档以了解正确使用方法。您可以从 JSON 中“修剪”不必要的数据并处理任何循环引用。

事情就是这样,如果您有一个巨大的对象并且该对象被引用了数十次,那么该对象将在您的 JSON 中出现数十次。换句话说,它作为一个对象存在于内存中一次,但是当被序列化时,对象会被一遍又一遍地序列化。这会使您的 JSON 膨胀。取出该对象,将其转换为自己的 JSON,并用 ID 替换对它的引用可以显着缩小 JSON。如果需要或需要,可以使用 replacer 参数来执行此操作。

【讨论】:

  • 将巨大的变量分割成更多的小块就可以了,错误消失了。
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2020-11-17
  • 2023-02-02
  • 2021-05-21
相关资源
最近更新 更多