【问题标题】:jQuery Asynchronous each() function - how to exit the callback?jQuery 异步 each() 函数 - 如何退出回调?
【发布时间】:2012-04-08 21:50:12
【问题描述】:

我正在使用发布于:

的异步 each() 函数插件代码

jQuery Tips and Tricks

效果很好,但我似乎无法使用 return 退出正在运行的回调函数;或返回真;。结果是,当满足“退出”条件时,它会停止所有剩余的 $.forEach “循环”执行。

由于插件实现了 setTimeout 循环方法,也许我只需要知道如何退出已经运行的 setTimeout 回调函数?顺便说一句 - 我避免使用 for 循环或 $.each() 以避免在大型 json 处理发生时浏览器锁定。 “背景”循环显着提高了 UI 的性能。

$.forEach(json, 1000, function(idx,item) {
    if(some_condition) return true; //exit this timeout iteration

    //otherwise do something
});

jQuery.forEach = function (in_array, in_pause_ms, in_callback)
{
    if (!in_array.length) return; // make sure array was sent

    var i = 0; // starting index

    bgEach(); // call the function

    function bgEach()
    {
        if (in_callback.call(in_array[i], i, in_array[i]) !== false)
        {
            i++; // move to next item

            if (i < in_array.length) setTimeout(bgEach, in_pause_ms);
        }
    }

    return in_array; // returns array
};


jQuery.fn.forEach = function (in_callback, in_optional_pause_ms)
{
    if (!in_optional_pause_ms) in_optional_pause_ms = 10; // default

    return jQuery.forEach(this, in_optional_pause_ms, in_callback); // run it
};

非常感谢!

【问题讨论】:

  • 我不太明白这里的问题,如果您只是 return false;,您的代码应该停止循环 in_array(并继续处理所有其他返回值,甚至是 undefined)。
  • 试过返回false;不行。你一定在想$.each()。请参阅我提供的插头代码。不涉及 each() 循环。
  • @Inator,你的问题和标题都说each
  • 请发布回调的代码 - if (in_callback.call(in_array[i], i, in_array[i]) !== false) 这一行确保如果返回“false”,则迭代停止。问题一定出在其他地方……

标签: javascript jquery settimeout


【解决方案1】:

来自文档:

我们可以在特定的迭代中打破 $.each() 循环,方法是 回调函数返回false。

编辑:这也适用于您的自定义 forEach

【讨论】:

  • @Inator:但是您尝试过 Matthew 的解决方案吗?看看插件中的这行代码:if (in_callback.call(in_array[i], i, in_array[i]) !== false) 如果你从回调中return false,它似乎会停止迭代。
  • 啊……但我不想停止迭代……我想继续下一项。
  • @Inator:哦,那么任何return 都会停止当前回调。您是否设置了return 条件?如果是,您是否已验证满足条件?或者如果它总是停止迭代,那么您是否检查过控制台是否有错误?
  • 是的,我已验证满足条件。所以,如果我没看错,它会按设计运行吗?
  • @Inator:如果你return 不是false,它应该继续进行下一次迭代。如果它过早地停止迭代,那么还有其他问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2010-12-20
  • 1970-01-01
  • 2021-11-02
  • 2018-08-22
相关资源
最近更新 更多