2012-04-08 4 views
-2

Я использую асинхронный каждый() функции плагин код размещен на сайте:jQuery Асинхронная функция each() - как выйти из обратного вызова?

jQuery Tips and Tricks

Он работает хорошо, но я не могу выйти из запущенной функции обратного вызова с помощью возврата; или вернуть true ;. при условии, что когда условие «выйти» выполняется, оно останавливает все оставшиеся $ .forEach «loop» выполнение.

Поскольку плагин реализует подход loopTimeout, возможно, мне просто нужно знать, как выйти из уже запущенной функции обратного вызова setTimeout? BTW. Я избегаю использовать для циклов или $ .each(), чтобы избежать блокировки браузера при обработке большого json. «Фоновый» цикл значительно улучшает производительность пользовательского интерфейса.

$.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 
}; 

Спасибо большое!

+0

См. [Как выйти из $ .each в jquery?] (Http://stackoverflow.com/questions/3944083/how-do-i-break-out-of-an-each-in- jquery) –

+0

Я действительно не понимаю проблему здесь, если вы просто «возвращаете false», ваш код должен прекратить цикл через in_array (и продолжить на каждое другое возвращаемое значение, даже «undefined»). – Niko

+0

попытался вернуть false; нет. Вы должны думать о $ .each(). См. Поставляемый мной код разъема. ни одна из циклов(). – Inator

ответ

0

Из документов:

Мы можем разбить $ .each() цикл в определенной итерации, сделав функцию обратного вызова возвращает ложь.

EDIT: Это относится к вашим обычаям forEach.

+0

Это не цикл $ .each(). – Inator

+0

@ Инатор: Но вы попробовали решение Мэтью? Взгляните на эту строку кода из плагина: 'if (in_callback.call (in_array [i], i, in_array [i])! == false)' Если вы возвращаете false из обратного вызова, это похоже на это остановит итерации. –

+0

Этот ответ прав, но объяснение неверно. – Niko

Смежные вопросы