2014-10-30 4 views
0
$('#btnAutoRun').click(function(data){ 

$('.payment').each(function(index, element) { 
    //Looks to see if it shoudld run Credit Card 
    if ($('#chkRun',this).is(':checked')) { 
     //Gather values to pass in querystring 
     strPayment = "cn=" + $(this).attr("cn") + "&amount=" + $(this).attr("minimumDue") + "&mp=" + $(this).attr("minimumDue") + "&sn=" + $(this).attr("sn"); 
     //calls page that submits information for processing 
     $.get("fn_process_payment.asp?" + strPayment + "&desc=Monthly Payment", function(data){ 
     }); 
    } 
}); 
    //refreshes payments box 
    loadPayments(); 

Когда я проверил, он работает ОЧЕНЬ быстро. Если у меня еще два проверенных, это запустит всю систему, и я должен полностью перезагрузить локальный хост. Есть ли лучший способ выполнить задачу или есть способ заставить ее ждать, пока $ .get не будет завершен, чтобы продолжить процесс?

+0

Просто примечание, но '$ ('# chkRun', this)'. Зачем ты это делаешь? У вас есть несколько элементов с id 'chkRun'? Не делай этого! Идентификаторы должны быть уникальными. –

+0

client info

+0

Зачем вам вообще нужен «.each»? –

ответ

1

Браузеры, как правило, имеют ограничение на количество процессов загрузки HTTP, которые они будут запускать сразу; и большинство версий IIS - не уверен, что это то, что вы используете, - также ограничьте количество запросов, которые они будут обрабатывать. Вы можете столкнуться с чем-то подобным.

Это говорит о том, что есть способ перебрать асинхронные задачи, но он получает сложный комплекс - для обычной техники требуется рекурсия. Что-то вроде этого:

$('#btnAutoRun').click(function(data){ 

    var $paymentElements = $('.payment'); 
    processPayment(0); 

    function processPayment(idx){ 
     if (idx >= $paymentElements.length) return; 
     if ($('#chkRun',this).is(':checked')) { 
      var elm = $paymentElements[idx]; 
      //Gather values to pass in querystring 
      strPayment = "cn=" + $(elm).attr("cn") + 
       "&amount=" + $(elm).attr("minimumDue") + 
       "&mp=" + $(elm).attr("minimumDue") + 
       "&sn=" + $(elm).attr("sn"); 
      //calls page that submits information for processing 
      $.get("fn_process_payment.asp?" + strPayment + "&desc=Monthly Payment", function(data){ 
       processPayment(idx + 1); 
      }); 
     } 
    } 
}); 

Или что-то в этом роде - не проверили его, могут быть некоторые ошибки там.

В современных версиях C# вы можете использовать ключевые слова async и await, что позволяет избежать рекурсивной части, что удобно. Но JS еще не совсем там.

+0

Спасибо, это сработало отлично. Я вызываю это нажатием кнопки, поэтому мне просто пришлось удалить «var» из $ paymentElements. –

+0

Вы можете оставить 'var' на месте, если вы поместите все это, включая' function processPayment() 'внутри обработчика щелчка кнопки. См. Мое редактирование. На самом деле, это лучше, потому что он сохраняет переменные в правильной области. –

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