в javascript рекурсивное использование функций обратного вызова для управления циклом - это опасно? - PullRequest
2 голосов
/ 26 июля 2011

в следующем коде не может использовать цикл for над массивом, поскольку каждый шаг неблокируемый и требует функции обратного вызова

Теория работы: форма отправляет вызовы verify(), где el -HTMLFormElement и nextFunc - это функция обратного вызова.каждый элемент, содержащийся в форме, проверяется с помощью verifyCol(), с возвратом к nextFunc(err) при первой возвращенной ошибке или, когда сделано, с nextFunc().

// verify as called from post
Post.prototype.verify = function( el, nextFunc ) {
        var post = this;     
        var arr = this.entryArr(el);
        (function verifyOne( i ) {
                if( i >= arr.length ) nextFunc();
                else post.colVerify( arr[i], function(err) {
                        if( err ) nextFunc( err );
                        else verifyOne( i+1 );
                } );    
        })(0);          
}

Этот подход имеет смысл для меня(хотя подозрительно выглядит как Лисп).

Правильная ли здесь парадигма?Есть ли опасность при рекурсивном вызове функций обратного вызова?

1 Ответ

2 голосов
/ 26 июля 2011

JavaScript - это вариант lisp (потомок от схемы), поэтому он выглядит как lisp.

В приведенном выше коде нет рекурсиисамое строгое определение рекурсии), если функция post является функцией обратного вызова из HTTP-запроса - эти функции являются просто дескрипторами, которые хранятся в виде ссылок и вызываются через очередь событий, когда сообщение HTTP возвращается с данными.

Возможность использования рекурсии в JavaScript для рекурсии цикла зависит от того, реализован ли интерпретатором JavaScript tail-call-оптимизация , но в большинстве реализаций JavaScript (добавьте комментарий, если он вам известен) этого не имеетреализовано, поэтому обычно рекурсия цикла (то есть вызов функции без помещения вызова в очередь событий) может вызвать проблемы, если стек вызовов становится слишком глубоким.

В вашем случае вызов verifyOne никогда не вызывается до тех пор, покасообщение возвращается с предыдущего вызова, и, следовательно, ваш цикл проходит черезочередь событий

Парадигма программы выглядит хорошо и похожа на учебник для меня.

...