【问题标题】:Why a Javascript array passed as function parameter may lose it's content when the function is called sequentially?为什么当函数被顺序调用时,作为函数参数传递的 Javascript 数组可能会丢失其内容?
【发布时间】:2012-12-07 03:15:31
【问题描述】:

我在这里坐了一会儿,现在想知道为什么在第二次调用函数调用时会丢失数组参数。

我正在处理的脚本在 CouchDB/PouchDB 之后映射,并将项目作为 JSON 字符串存储在多个存储(包括本地存储)中。参数是:

_id         id of the item
_rev        revision string (version), counter and hash
_content    whatever content
_revisions  array of all prior hashes and current counter
_revs_info  all previous revisions of this item with status

我目前正在尝试PUT 操作,默认情况下会更新现有文档。当我使用多个存储时,我还有一个PUT SYNC,它将文档的版本从一个存储“复制和粘贴”到另一个存储(目标是每个存储都可以使用每个版本)。我还保留了一个带有文档树的单独文件,其中存储了所有版本的哈希值。此树文件使用PUT 提供的_revs_infoSYNCs 上更新。

我的问题是连续的SYNC PUTs。第一个有效,第二个我失去了_revs_info 参数。我也不知道为什么……

这是我的第一个电话(来自我的 QUnit 模块),效果很好:

o.jio.put({
    "content":'a_new_version',
    "_id":'myDoc',
    "_rev":"4-b5bb2f1657ac5ac270c14b2335e51ef1ffccc0a7259e14bce46380d6c446eb89",
    "_revs_info":[
        {"rev":"4-b5bb2f1657ac5ac270c14b2335e51ef1ffccc0a7259e14bce46380d6c446eb89","status":"available"},
        {"rev":"3-a9dac9ff5c8e1b2fce58e5397e9b6a8de729d5c6eff8f26a7b71df6348986123","status":"deleted"},
        {"rev":fake_rev_1,"status":"deleted"},
        {"rev":fake_rev_0,"status":"deleted"}
        ],
    "_revisions":{
        "start":4,
        "ids":[
            "b5bb2f1657ac5ac270c14b2335e51ef1ffccc0a7259e14bce46380d6c446eb89",
            "a9dac9ff5c8e1b2fce58e5397e9b6a8de729d5c6eff8f26a7b71df6348986123",
            fake_id_1,
            fake_id_0
            ]}
    },
    function(err, response) { 
       // run tests
    });

但是,当我第二次调用同一个函数时:

o.jio.put({
    "content":'a_deleted_version',
    "_id":'myDoc',
    "_rev":"3-05210795b6aa8cb5e1e7f021960d233cf963f1052b1a41777ca1a2aff8fd4b61",
    "_revs_info":[   {"rev":"3-05210795b6aa8cb5e1e7f021960d233cf963f1052b1a41777ca1a2aff8fd4b61","status":"deleted"},{"rev":"2-67ac10df5b7e2582f2ea2344b01c68d461f44b98fef2c5cba5073cc3bdb5a844","status":"deleted"},{"rev":fake_rev_2,"status":"deleted"}],
    "_revisions":{
        "start":3,
        "ids":[
            "05210795b6aa8cb5e1e7f021960d233cf963f1052b1a41777ca1a2aff8fd4b61",
            "67ac10df5b7e2582f2ea2344b01c68d461f44b98fef2c5cba5073cc3bdb5a844",
            fake_id_2
            ]}

    },
    function(err, response) {
      // run tests
    });

我的脚本失败了,因为_revs_info 数组不包含任何内容。我添加的所有其他参数和所有随机参数都被传输。如果我添加stringobject 而不是array,它们也可以安全地将其添加到我的脚本中。

然而数组...没有通过...

问题:
我已经坐了几个小时试图确定我没有找到的点,但我很无能为力。那么有谁知道原因,为什么arrays 在将它们作为 Javascript 中的参数传递时可能会丢失它们的内容?

谢谢!

编辑
我在第一个SYNC-PUT 之后添加了一个常规PUT,它通过了(没有定义_revs_info)。

【问题讨论】:

  • 也许你调用的函数改变了数组?
  • 嗯。让我试试……好主意。
  • 仍在追踪...但我有嫌疑人。

标签: javascript arrays function parameters couchdb


【解决方案1】:

JavaScript 函数完全有可能改变传入的数组。考虑这个例子:

function removeAll(a) { a.splice(0); }

var arr = [1, 2, 3];
removeAll(arr);
console.log(arr); // empty array

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多