繁体   English   中英

jQuery 在分块 $.each() 完成后运行代码

[英]jQuery run code after chunked $.each() is finished

使用以下代码:

$('#button').on('click', function () {

  var longArray = searchArray;   // assume this has 100 or more postalcodes init
  var shortArrays = [], i, len;

  for (i = 0, len = longArray.length; i < len; i += 100) {
      shortArrays.push(longArray.slice(i, i + 100));
  }

  // Now we iterate over shortArrays which is an array of arrays where each array has 100 or fewer
  // of the original postalcodes in it

  for (i = 0, len = shortArrays.length; i < len; i++) {

      // shortArrays[i] is an array of postalcodes of 100 or less
      $.each(shortArrays[i], function(index, value){
        setTimeout( function() {

          // Each parent gets its own searchToggle class
          $('.postcodes input[data-postcode*="' + value + '"]').parent().parent().addClass('searchToggle');
          // Each parent also gets a data filter attribute for ordering the results
          $('.postcodes input[data-postcode*="' + value + '"]').parent().parent().attr('data-filter' , index);
          // We display the items in the search array
          $('.postcodes input[data-postcode*="' + value + '"]').parent().parent().css('display', 'flex');
          $('.postcodes .searchToggle .postcode input[data-postcode*="' + value + '"]').parent().css('display', 'flex');

        }, 0 );
      })

  } // /for

  alert('Finished message');

});

一旦 $.each() 完成,我会尝试显示一条警报消息(用于调试)。 由于每个都经过一个可能有 1000 多个邮政编码的数组,所以我将它分成 100 个块。这是为了防止可怕的浏览器无响应。 这一切正常,但警报会在点击时立即触发。

我已经尝试了几件事:

  1. 我尝试使用计数: ABOVE THE EACH var count = 0; INSIDE THE EACH count++ if ( count == longArray.length ) { ALERT } ABOVE THE EACH var count = 0; INSIDE THE EACH count++ if ( count == longArray.length ) { ALERT }但这也立即触发了警报???
  2. 我尝试使用间隔,但几乎立即变得一团糟。
  3. 我尝试了其他几个 SO 答案,但所有这些都导致警报立即触发。

在查看 jQuery 文档和我之前编写的代码时,它应该只在每个代码完成后运行代码,但在这种情况下它不会。

关于为什么会这样以及如何解决它的任何想法。

PS:此警报可能是其他代码。 就像对结果或其他东西进行排序一样。

PS2:我可以更改您看到的所有 js/jQuery,但我无法更改任何 HTML 选择器。

PS3:感谢您考虑这个问题,特别是评论/回答!

我已经通过添加另一个 setTimeout 来解决它。

所以我替换了警报(见问题)

alert(Finished message);

setTimeout( function() {

  // As an example I used alert in my question and here in this answer. 
  // This can be offcourse anything else. I use it for instance to sort the results.
  alert(Finished message);

}, 0 );

这对我有用,但它可能不是处理它的最佳方法。 所以我还是很期待有经验的人对这个问题或答案的看法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM