jQuery для цикла с должным подсчетом - PullRequest
0 голосов
/ 09 октября 2010

Итак, у меня есть следующая строка кода, которая выполняет цикл for и объекты 12 в каждом цикле.Если я предупреждаю прямо перед сообщением, он предупреждает номера, как и следовало ожидать (72, 60, 48, 36, 24).Но с оповещением внутри поста он предупреждает число 12 пять раз.Есть идеи, почему это так?Любая идея, откуда исходит число 12?

function loadEstimates(option){
    for(term_length=72; term_length>=24; term_length-=12){
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};
        $.post('../includes/process.php', post_options, function(response, status){
            alert(term_length);
        });
    }
}

Вторая часть вопроса, я хочу вывести их по порядку, и я заметил, что иногда пост будет выводить что-то случайное, как 36,48, 24, 72, 60 из-за времени отклика сервера.Как я могу поместить 'ответ' из сообщения в массив или что-то, что позволит мне отсортировать его перед отображением?

Спасибо !!

/////// EDIT //////// Хорошо, поэтому я воспользовался некоторыми советами ChessWhiz, использовал массив и придумал.

function loadEstimates(option){
    var term_length = new Array('72','60','48','36','24');
    var term_length_output = new Array(5);
    $.each(term_length, function(index, t_length){
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:t_length};
        $.post('../includes/process_instantquote.php', post_options, function(response, status){
            term_length_output[t_length] = response;
        });
    });

    alert(term_length_output);
}

Это также решает мою потенциальную загадку, если я решу использовать число вterm_length, который не делится на 12. Но term_length_output все еще пуст.Любая идея, что я делаю не так с этим?


** Окончательное редактирование *****

Вот код, который я использовал в итоге.Он делает именно то, что мне нужно.Это, вероятно, не самый правильный 100% способ, но он работает.

Большое спасибо всем за ответы и помощь !!!

function loadPriceEstimates(option){
    $('#package-term-options table tbody').append('<tr><td style="text-align:center;" colspan="5"><img src="images/ajax-loader-small.gif" alt="Loading..." class="small-loading"/></td></tr>').show();
    var term_length = new Array('72','60','48','36','24');
    var term_length_output = new Array();
    var count = 0;
    $.each(term_length, function(index, t_length){
        var post_options = {loadPriceEstimates: 'true', coverage_option:option, term_length:t_length};
        $.post('../includes/process_instantquote.php', post_options, function(response, status){
            if(status == 'success'){
                term_length_output[t_length] = response;
                count++;
                if(count == 5){
                    term_length_output.sort();
                    term_length_output.reverse();
                    $('#package-term-options table tbody').html('');
                    $.each(term_length_output, function(index, value){
                        $('#package-term-options table tbody').append(value);
                    });
                }
            }
        });
    });
}

Ответы [ 3 ]

2 голосов
/ 09 октября 2010

Я думаю, это потому, что тело цикла for не является областью для закрытия функции обратного вызова, а область является функцией контейнера.

Попробуйте это:

function loadEstimates(option){
    for(term_length=72; term_length>=24; term_length-=12){
        postProcess(term_length);
    }
}

function postProcess(term_length) {
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};
        $.post('../includes/process.php', post_options, function(response, status){
            alert(term_length);
        });
}

Подробнее см .:

1 голос
/ 09 октября 2010

Проблема связана с тем, как работает for: она использует одну и ту же переменную на протяжении всей своей жизни (а не создает новые), что означает, что одна и та же переменная привязывается к вашему $.post() обратному вызову каждый раз. Вызовы AJAX являются асинхронными, и этот обратный вызов не будет вызываться до тех пор, пока ваш цикл не завершится, а term_length не опустится до 12.

Для обсуждения общей проблемы вне JavaScript, см. "Лямбда Python сломана!"

Решение, таким образом, заключается в том, чтобы, так или иначе, получить JavaScript для создания новой переменной на каждой итерации, чтобы она не изменялась из-за вас во время цикла. Один из способов сделать это - передать его через функцию. См. Ответ Николаса Боттарини для кода.

1 голос
/ 09 октября 2010

Использование индексной переменной, которая считает в обратном направлении на 24, подвержено ошибкам. Вместо этого используйте нормальный индекс, а затем вычислите term_length. Далее вы можете использовать массив для хранения результатов. Однако, если обратный вызов еще не завершен, массив еще не будет содержать все результаты. Наконец, вам нужно сделать копию переменной цикла, чтобы избежать замыкания. Пример:

function loadEstimates(option) {
    for(i = 0; i < 5; i++) {
        var resultsIndex = i;
        var term_length = 72 - (i * 12);
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};

        $.post('../includes/process.php', post_options, function(response, status){
            results[resultsIndex] = response;
        });
    }
}

Тогда ваши результаты будут хорошо выровнены в массиве results. Побочный эффект [12, 12, 12, 12, 12], вызванный закрытием, в основном вызван тем, что последнее значение term_length выводится каждый раз, а это 24 - 12 = 12 , из-за к тому, что цикл for изменяет его, и функция закрывает его.

...