我想增加一个变量的值
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>
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供参考。