在javascript / Jquery中使用Ajax调用时出现类型错误

时间:2016-08-23 11:32:13

标签: javascript jquery ajax

我在使用Jquery在循环中提取一些值时遇到以下错误。我在下面显示我的错误。

Uncaught TypeError: Cannot read property 'no_of_optional' of undefined

我正在解释下面的代码。

var data = $.param({
  'op': 'setPollField',
  'sid': id
});
$.ajax({
method: 'POST',
url: "dbcon/DBConnection.php",
data: data
}).done(function(msg) {
  var qdata = JSON.parse(msg);
  var get = $("#ques").val();
  var cntr = 0;
  for (var i = 1; i < get; i++) {
    if (i != 0) {
      $("#questions0").val(qdata[0].questions);
      $('#noofoption0').val(qdata[0].no_of_optional);
      var data = $.param({
        'op': 'getOptional',
        'id': qdata[0]['_id']['$id']
      });
      $.ajax({
        method: 'POST',
        url: "dbcon/DBConnection.php",
        data: data
      }).done(function(msg) {
          var optdata = JSON.parse(msg);
          var cnt = 0;
          for (var j = 0; j < qdata[0].no_of_optional; j++) {

          }
        }
        cnt++;
      }
    })
}
if (i == 1) {
  $('#questions' + i).val(qdata[i].questions);
  $('#noofoption' + i).val(qdata[i].no_of_optional);
  var data = $.param({
    'op': 'getOptional',
    'id': qdata[i]['_id']['$id']
  });
  $.ajax({
    method: 'POST',
    url: "dbcon/DBConnection.php",
    data: data
  }).done(function(msg) {
    var optdata = JSON.parse(msg);
    var cnt = 0;
    console.log('first question', qdata[i].no_of_optional);
    for (var j = 0; j < qdata[i].no_of_optional; j++) {

    }
  })
}
}
})

我在此console.log('first question',qdata[i].no_of_optional);收到错误。实际上qdata包含两组数据(qdata[0],qdata[1])但在第二个ajax调用i内部变为2。实际上我在第二次ajax调用期待qdata[1].no_of_optiona。请帮助我。

1 个答案:

答案 0 :(得分:1)

使用闭包,当调用done回调时for循环已完成并递增i: -

var data = $.param({
  'op': 'setPollField',
  'sid': id
});
$.ajax({
  method: 'POST',
  url: "dbcon/DBConnection.php",
  data: data
}).done(function(msg) {
  var qdata = JSON.parse(msg);
  var get = $("#ques").val();
  var cntr = 0;
  for (var i = 1; i < get; i++) {
    if (i == 1) {

      (function(i) {

        $('#questions' + i).val(qdata[i].questions);
        $('#noofoption' + i).val(qdata[i].no_of_optional);
        var data = $.param({
          'op': 'getOptional',
          'id': qdata[i]['_id']['$id']
        });

        $.ajax({
          method: 'POST',
          url: "dbcon/DBConnection.php",
          data: data
        }).done(function(msg) {
          var optdata = JSON.parse(msg);
          var cnt = 0;
          console.log('first question', qdata[i].no_of_optional);
          for (var j = 0; j < qdata[i].no_of_optional; j++) {

          }
        })

      })(i);
    }
  }
})