【问题标题】:Getting JSON data from deferred call in jQuery从 jQuery 中的延迟调用中获取 JSON 数据
【发布时间】:2014-02-26 14:08:47
【问题描述】:

我觉得我错过了一些完全简单的东西。请帮忙!我第一次使用这部分 jQuery....

这是我的代码。如何遍历do_it 返回的每个元素?

function do_it(a){
  return $.getJSON('url', {mode: 'get_array', id: a}); // returns JSON object
};

$.when.apply(do_it[1,2,3]).then (function(data){
  // how to get each element returned by do_it() here?
}, function () {console.log('Failed');<br>});

【问题讨论】:

  • 对不起,我的错字。这就是我的代码中的内容......已修复。
  • JSON 是什么样的?
  • 这里发生了很多奇怪的事情。您能否用简单的英语详细说明您正在尝试做什么?
  • do_it[1,2,3],这不应该是do_it([1,2,3])吗?
  • {"ID":1,"L_Name":"Jones","F_Name":"Jan","Email":"jjones@email.com","Telephone_No":"xxx. xxx.xxxx","机构":"IT","部门":"3","备注":"","秘书":0}{"ID":3,"L_Name":"Smith"," F_Name":"Christopher","Email":"email@gmail.com","Telephone_No":"","Institution":"IT","Department":"18","Notes":"","秘书":0}{"ID":4,"L_Name":"White","F_Name":"Amanda","Email":"white@email.com","Telephone_No":"","Institution" :"UT","部门":"25","笔记":"","秘书":0}

标签: javascript jquery json apply deferred


【解决方案1】:

在此示例中,我已修复数据中的所有错误并使用 deferred 对象来复制程序的功能。

Fiddle.

data 是一个包含多个对象的数组。代码循环遍历数组对象并从每个对象中挑选出值以添加到表中。请注意,我倾向于使用 array.join() 而不是字符串连接来构建 HTML - YMMV。

$.when(do_it()).then(function (data) {
    var html = [];
    html.push('<table>');
    for (var i = 0, l = data.length; i < l; i++) {
      var row = [];
      row.push('<tr>');
      row.push('<td>' + data[i].ID + '</td>');
      row.push('<td>' + data[i].L_Name + '</td>');
      row.push('<td>' + data[i].F_Name + '</td>');
      row.push('<td>' + data[i].Email + '</td>');
      row.push('<td>' + data[i].Department + '</td>');
      row.push('</tr>');
      html.push(row.join(''));
    }
    html.push('</table>');
});

希望对你有用。

【讨论】:

  • 试过这个:data[i].L_Name 出现未定义,data[i] 也是如此。
  • L_Name 是我必须在您发布的 JSON 中修复的问题之一。它可能与那个下划线有关。你有没有找回任何数据?
  • 我在第一个响应中列出了 JSON 对象(显然有一些拼写错误)。如果我只发送一个数组元素并返回一个简单的 JSON 对象,我可以解析它,但是当我发送一个数组并返回一个复杂的 JSON 对象时,无论我如何尝试,数据都会出现未定义 - 我已经尝试过! -- 解析它...gaaah
  • 因此,如果您执行do_it(1),您将得到一些可以解析回来的内容,但您执行do_it([1,2,3]) 您没有?
  • Andy——事实证明我的 json 格式不正确。事实证明,我一直在查看该程序的旧版本,而当我查看当前版本时,我发现了错误并修复了它。呸!感谢您的努力。 --纳特
【解决方案2】:

$.getJSON 返回一个承诺对象:http://api.jquery.com/jquery.getjson/
这样,您可以附加 donefailalways 函数以分别运行。使用它,您可以将代码格式化为。

function do_it (id) {
    return $.getJSON(url, {
        mode: 'get_array',
        id: id
    });
}

do_it([1, 2, 3]).done(function (data) {
    for (var key in data) {
        console.log(key, " = ", data[key]);
    }
}).fail(function () {
    console.log("Failed");
});

我不确定您打算将什么传递给do_it,如果它是数组或单独的每个id,如果是后者,您可以这样做:

$.each([1, 2, 3], function (id) {
   do_it(id) // same stuff as above

编辑:根据您的 cmets,这里有一个建议,虽然不是表现最好的建议。

var data = [];

$.when.apply($.map([1,2,3], function (id) {
    return do_it(id).done(function (d) {
        data.push(d[0]);
    });
}).done(function () {
    for (var d in data) {
        console.log(d);
    }
}).fail(function() {
    console.log("Failed");
});

【讨论】:

  • 问题是,尽管获得了 getJSON 返回,但“数据”中没有出现任何内容,因此失败了。我正在向 php 程序发送一个数组并获得 JSON 响应。当数组中有一个元素(和一个 JSON 对象)时,数据会显示,但当我在发送多元素数组后得到一个复杂的 JSON 对象时不会显示...
  • 你们有个人可以看到的现场演示吗?什么对您来说是一个复杂的 JSON 对象。您确定 id 应该是一个数组而不仅仅是一个 id (例如一个数组元素)。听起来是这样的。
  • 对不起我的术语:我所说的复杂对象是一个编码的关联数组。 php 为每个 id 创建一个关联数组,然后 json_encode 整个数组并将其发送回。当只有一个 id 时,数组中只有一行在编码之前(我通过 data[0] 得到它),当有更多行时,我无法得到它。所以看起来我将不得不以不同的方式返回数据或找到另一种解析方式。
  • 您可以尝试$.parseJSON (jQuery.parseJSON),但如果它在您的帖子中的 cmets 中返回,而 {"ID":....}{"ID":....} 没有出现错误,则会引发错误。
【解决方案3】:

假设返回值是一个数组:

$.when.apply(do_it[1,2,3]).then(function(data){
   $(JSON.parse.(data)).each(function(index, element){
   //do stuff
   });
}, function () {console.log('Failed');<br>}); 

编辑:

根据您的 cmets,我们假设:

var data = '[{"ID":1,"L_Name":"Jones","F_Name":"Jan","Email":"jjones@email.com","Telephone_No‌​":"xxx.xxx.xxxx","Institution":"IT","Department":"3","Notes":"","Secretary":0},{"I‌​D":3,"L_Name":"Smith","F_Name":"Christopher","Email":"email@gmail.com","Telephone‌​_No":"","Institution":"IT","Department":"18","Notes":"","Secretary":0},{"ID":4,"L_‌​Name":"White","F_Name":"Amanda","Email":"white@email.com","Telephone_No":"","Inst‌​itution":"UT","Department":"25","Notes":"","Secretary":0}]';

请注意,我添加了数组 [ ... ] 的左括号和右括号以及元素之间的逗号。

然后循环遍历你可以做的数组:

var json = JSON.parse(data);
$(json).each(function(index,element){
    //do stuff
    alert("index: " + index + " element: " + element );
});

【讨论】:

  • 我认为“解析”和开放括号之间有一个额外的点。但它不适用于我回来的阵列 JSON。
  • 我认为您的回复格式不正确;在您提供的示例中,缺少左括号和右括号,并且数组元素之间没有逗号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多