Есть ли возможность для двух экземпляров асинхронных функций Javascript, выполняющих два блока кода одновременно? - PullRequest
6 голосов
/ 23 июля 2010

Я понимаю, что Javascript не имеет нескольких потоков, но я хотел бы знать, есть ли шанс на разрыв следующего кода. Насколько я понимаю, до тех пор, пока не будет вызвана асинхронная функция, такая как setTimeout или вызов AJAX, после начала выполнения блока кода он не сможет приостановиться, пока не завершится или не вызовет асинхронную функцию.

Обычно пользователи выбирают несколько флажков, а затем нажимают кнопку, которая выполняет AJAX-обработку своих выборов. Моя цель - иметь значок «Сохранение ...», который остается только до тех пор, пока все процессы AJAX не будут завершены, и после того, как все будет завершено, отобразится сообщение об успехе.

Запрещая любые ошибки AJAX, до тех пор, пока функция обратного вызова в jQuery.post выполняется полностью без перерыва, я не вижу, как if(numProcessed == toProcess) когда-либо выполнялся бы более одного раза или менее одного раза. Но если два обратных вызова AJAX попадают в функцию обратного вызова, оба увеличивают счетчик numProcessed перед тем, как перейти к следующему if, то кажется, что код внутри будет выполнен дважды.

var numProcessed = 0;
var checkedBoxes = jQuery("input[type=checkbox]:checked");
var toProcess = checkedBoxes.size();

checkedBoxes.each(function() {
  jQuery.post('somepage.php',{...},function(results) {
    numProcessed++;
    if(numProcessed == toProcess) {
      jQuery("#saving-message").remove();
      jQuery("#feedback-panel").text('Successfully processed all selections.');
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

В JavaScript есть только один поток, поэтому каждая функция, которую нужно выполнить, помещается в стек и должна ждать, пока все остальные будут выполнены. В вашем случае «каждая» является первой функцией в стеке, поэтому каждая функция обратного вызова должна ждать и будет выполняться в порядке, который они помещают в стек. Ведь «numProcessed == toProcess» может быть истинным только один раз.

0 голосов
/ 23 июля 2010

Команда rx.net представила rx для javascript.Реактивные расширения предназначены для асинхронного программирования.они также написали для rxjs для jquery тоже.Может быть, вам нужен набор http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...