2014-05-23 44 views
0

我正在写循环,显示创建的链接,并使用此循环:的JavaScript与jQuery循环不行

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)八方通保持不变,唯一的网址更新。但如果我在第二行使用console.log(after for() {),那么url名称应该更改。

我错了什么?

+1

你能设置一个的jsfiddle那复制了这个问题?在你的代码的这一部分中没有什么明显的。 –

+0

对我来说这有点难,因为我从来没有使用过这个:/但如果你希望你能访问一个网站。 [WebSite here](http://revix.no-ip.biz/laravel/public/)只是尝试上传几个文件,所有时间只显示第一个文件名,但链接正常更新。 – Mik

+1

请参阅此:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

回答

2

请不要在循环中执行类似上述的异步调用,有太多的失败点。如果服务器超时,则有许多请求会集中并无所作为,并且无法保证返回的顺序。这是更好地调用下一个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); 
+0

你的意思是for循环不等到1通话结束? – Mik

+1

@Mik - Nope,'$ post'是异步的,所以不管前面的 – tymeJV

+0

的状态如何,这些调用都会一个接一个地开启。非常感谢:)不知道这一点。 – Mik