【问题标题】:Javascript/jQuery set variable to object property for multiple $.ajax callsJavascript/jQuery 将变量设置为多个 $.ajax 调用的对象属性
【发布时间】:2014-10-29 10:31:49
【问题描述】:

我希望通过 $.ajax 作为 JSON 发送许多不同的查询。

我已使用以下方法将这些查询存储在一个对象中:

var objectName = { 
"name1": { 
    "queryName": "longname1", 
    "queryAction": "JSONtoSend" 
}, 
"name2": { 
    "queryName": "longname2", 
    "queryAction": "JSONtoSend" 
},  
};

然后我将浏览 queryActions 并设置它们:

for (var i = 0, len = Object.keys(objectName).length; i < len; ++i) {
    var indexName = Object.keys(objectName)[i];
    objectName[indexName].queryAction = "";

    var JSONtoTransfer = objectName[indexName].queryAction;
}

$.ajax({
    type: "POST",
    url: 'URL',
    data: JSONtoTransfer,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(dataReturn){
        alert(dataReturn.blah);
    }
});

我无法设置 var JSONtoTransfer。它给了我一个意想不到的 [ 错误。我该如何解决这个问题?如果我直接将它输入到 $.ajax 的数据参数中,我会得到同样的错误。

我正在使用的代码将查询正确地存储在对象中,但我需要一种方法来遍历它们并通过 $.ajax 发送。

感谢您的帮助。这段代码可能不是最有效的做事方式,所以如果有人有任何建议,也非常欢迎:-)

所以我把原代码写错了,$.ajax 调用应该包含在 for 语句中。所以它实际上是在迭代......

无论如何,我发现工作是创建一个数组,将 queryAction 推入其中,然后对其进行字符串化...

【问题讨论】:

  • 您必须在循环对象之前定义 JSONtoTransfer 变量: var JSONtoTransfer = []; for(...) { JSONtoTransfer.push(objectName[indexName].queryAction); }
  • 你为什么要设置objectName[indexName].queryAction = "";
  • @A.Wolff 我不是,它会是一个字符串/JSON。
  • @SimonHarper 你的代码对我来说没有多大意义......即便如此,你的 "JSONtoSend" 肯定不是有效的 json
  • 不够清楚,无法理解您要发送的内容。它是一个字符串吗?您希望 objectName.keys 成为 POST 参数吗?

标签: javascript jquery ajax json


【解决方案1】:

几个问题:

  • JSONtoTransfer 超出了您的 ajax 调用范围。如果您想在每次迭代中填充 JSONtoTransfer 并每次都使用这个不同的值发出 ajax 请求 - 将 ajax 调用放在 for 循环中(尽管我会认真考虑重构它以便进行一次 ajax 调用并反序列化它不同(如果是您的服务器端代码处理它))
  • 您将objectName[indexName].queryAction 设置为一个空字符串,然后将此值分配给JSONtoTransfer(现在总是一个空字符串)
  • 你的for 语法有点混乱。最佳做法是改变

    for (var i = 0, len = Object.keys(objectName).length; i &lt; len; ++i) {

    for (var i = 0; i &lt; Object.keys(objectName).length; ++i) {

    即无需将len 初始化为相同的值。注意:这更多是为了可读性,而不是(那么多)性能。如果您在循环中对 len 有其他用途,则此建议将不适用。

【讨论】:

  • 谢谢你。我把它作为一个例子,我实际上并没有将 queryAction 设置为空字符串。我希望将其设置为字符串,然后 $.ajax 调用将在“数据:”参数字段中使用该字符串。不幸的是,我无法更改服务器端代码。
【解决方案2】:

您的变量 objectName 实际上已经是 JSON 数据了。我可能错了,但我认为这应该可行(代码更少):

var jsonData = { 
    "name1": { 
        "queryName": "longname1", 
        "queryAction": "JSONtoSend" 
    }, 
    "name2": { 
        "queryName": "longname2", 
        "queryAction": "JSONtoSend" 
    },  
};

//Post with AJAX
$.post('url.php', jsonData, 'json')
.done(function(data) {
    alert('Succes!')
})
.fail(function(data) {
    alert('Failed!')
});

//This does the same (Post with AJAX)
$.ajax({
    url: 'url.php', //Get action attribute of the form
    type: "POST",
    data: jsonData,
    dataType: "json",
    .done(function() { //or success: function() {
            alert( "success" );
    })
    .fail(function() { //or error: function() {
            alert( "error" );
    })
    .always(function() { //or beforeSend: function() {
            alert( "complete" );
    });
});

【讨论】:

  • 这是有效的,并且可以工作 - 但也许他请求的资源需要一个不同形式的对象(这就是他试图用 for 将其拆分的原因)
  • @DeeMac - 我希望存储许多不同的 JSON 查询。每个名字一个。
【解决方案3】:

我不确定您想要什么,但正如其他人指出的那样,您的代码存在许多问题,但我认为您希望一个接一个地迭代地执行 ajax 调用。如果这是你想要的,那么看看 jQuery defered -docs are here.Hope that help

【讨论】:

  • 我的错误,$.ajax 调用应该包含在 For 语句中。
  • @SimonHarper 看看这个 (aameer.github.io/articles/two-level-ajax-in-a-loop),也许它会有所帮助。此外,只是为了澄清你想向 ajax 提供什么样的数据,你能举个例子吗
猜你喜欢
  • 2020-12-26
  • 2019-11-25
  • 2012-01-07
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多