我正在编写for循环来显示创建的链接,并使用这个循环:
for (var x = 0; x < data.succeeded.length; x++) {
$.post("{{URL::action('make')}}", {url: "{{URL::route('home')}}/uploads/" + data.succeeded[x].file, name: data.succeeded[x].name}, function(url) {
anchor = document.createElement('a');
anchor.href = url;
anchor.target = '_blank';
anchor.innerHTML = x + ' ' + data.succeeded[x].name + '<br><small>(' + url + ')</small>';
succeeded.appendChild(anchor);
});
}
,但在$.post
函数url名称(data.succeeded[x].name
)总是保持不变,只有url更新。但是如果我在第二行(after for() {
)上使用console.log, url名称应该改变。
我做错了什么?
请不要在循环中执行像上面这样的异步调用,有太多的失败点。如果服务器超时,就会有许多请求聚集在一起,什么也不做,而且返回的顺序也得不到保证。最好在刚刚完成的AJAX回调中调用下一个AJAX调用,这样一切就井然有序了,并且可以保证一个请求在另一个请求完成之前不会发生:
function makeAjaxCall(position) {
$.post("{{URL::action('make')}}", {url: "{{URL::route('home')}}/uploads/" + data.succeeded[position].file, name: data.succeeded[position].name}, function(url) {
anchor = document.createElement('a');
anchor.href = url;
anchor.target = '_blank';
anchor.innerHTML = position + ' ' + data.succeeded[position].name + '<br><small>(' + url + ')</small>';
succeeded.appendChild(anchor);
if (position < data.succeeded.length) makeAjaxCall(++position);
});
}
makeAjaxCall(0);