在 jquery ajax 成功处理程序中添加增量变量

问题描述 投票:0回答:1

我想增加一个变量的值

ii
,但是它的值没有改变。如果我在
ii++;
函数调用之前移动
alert
,它会增加,但设置为
#spanstatus
的值始终是
0
。 如何增加
ii
的值,并在我的
$.ajax
调用之前访问它?

<html> 
      <span id="spanstatus"></span><br>

<script src="../js/jquery-1.12.4.min.js"></script>
<script>
var data = new FormData();
data.append('test', 'a');
data.append('test1', 'b');
data.append('test2', 'c');

function upload() {
        $('#spanstatus').html('');
        var ii=0;
        for(var [name, value] of data) {
            $('#spanstatus').append('<i>Uploading <b>"'+name+'"</b></i>...<span id="spanupload_'+ii+'">'+ii+'</span><br>');
                $.ajax({
                    type:'POST',
                    method: 'POST',
                    timeout:2000,
                    url:'upload.php?val='+value,
                    dataType: "json",
                    data:  value,
                    contentType: false,
                    cache: false,
                    processData:false,
                    // async: false,
                    success:function(response){
                            $('#spanupload_'+ii).html(ii+' OK');
                            alert(ii+'ok='+name);
                            ii++;
                    }
                });
        }
}

$(document).ready(function(){
    upload();
});

</script>
 </body> 
</html>
jquery ajax auto-increment
1个回答
1
投票

success
处理程序在收到响应之前不会执行,这在 later 的某个时间发生,因为这是一个异步处理程序。这意味着当您每次调用
ii
时,
$('#spanstatus').append
的值不会改变。

您可以移动

ii
的增量,使其在 before
$('#spanstatus').append
之前发生,但这引入了一个新问题。在
success
处理程序中,
ii
将针对
data
中的每个对象递增一次,因此它将始终具有相同的值 - 在本例中为
3
- 当您调用
$('#spanupload_'+ii).html(ii+' OK')
.

为了在 for 循环中保留对 each iteration 的引用,您必须在该迭代中创建一个值为

ii
的局部块范围变量。你需要为
name
做同样的事情。代码看起来像:

var data = new FormData();
data.append('test', 'a');
data.append('test1', 'b');
data.append('test2', 'c');

function upload() {
  $('#spanstatus').html('');
  var ii = 0;
  for (var [name, value] of data) {
    ii += 1;
    const nextii = ii;
    const nextName = name;

    $('#spanstatus').append('<i>Uploading <b>"' + nextName + '"</b></i>...<span id="spanupload_' + nextii + '">' + nextii + '</span><br>');
    $.ajax({
      type: 'POST',
      method: 'POST',
      timeout: 2000,
      url: 'upload.php?val=' + value,
      dataType: "json",
      data: value,
      contentType: false,
      cache: false,
      processData: false,
      // async: false,
      success: function(response) {
        $('#spanupload_' + nextii).html(nextii + ' OK');
        alert(nextii + 'ok=' + nextName);
      }
    });
  }
}

$(document).ready(function() {
  upload();
});

我创建了一个fiddle供参考。

© www.soinside.com 2019 - 2024. All rights reserved.