How to stop the loop until the response get in jquery?
我有这样的代码。 循环长度大于100。
1 2 3 4 5 6 7 8 | $('.check_box_ping:checked').each(function(i, obj) { $.post( "mass_ping.php", "ping", function(response) { } ); }); |
现在100
使用
标记和js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <body> <input type="checkbox" checked /> <input type="checkbox" checked /> <input type="checkbox" checked /> <input type="checkbox" checked /> </body> <script src="http://code.jquery.com/jquery-1.8.3.min.js"> function doRequest() { return $.post("script.php").done(function(response) { console.log('Loaded in %d seconds', response); }); } $(document).ready(function(){ var dfd = $.Deferred(), chain = dfd; $('input:checked').each(function() { chain = chain.pipe(function() { return doRequest().promise(); }); }); chain.done(function() { console.log('done') }); return dfd.resolve(); }); |
script.php的
1 2 3 4 5 6 | <?php $seconds = rand(2, 5); sleep($seconds); header("Content-type: text/html"); echo($seconds); ?> |
暂停每个循环的唯一方法是使帖子同步,这通常是一个非常糟糕的用户体验(它挂起浏览器)。
我建议的是你重构你的循环,这样你就可以完成上一篇文章的下一次迭代:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | (function() { var checked = $('.check_box_ping:checked'); var index = 0; function next() { if (index < checked.length ) { var item = checked.eq(index++); // use item here for your post $.post({...}, function(response) { // do your normal handling of the response here ... // now kick off the next iteration of the loop next(); }); } } next(); })(); |
你可以做两件事