两个异步Javascript函数实例是否有可能同时执行两个代码块?

aw *_*rud 6 javascript jquery multithreading javascript-events

我知道Javascript没有多个线程,但我想知道以下代码是否有任何破解的机会.我的理解是,除非调用异步函数,例如setTimeoutAJAX调用,否则一旦代码块开始执行,它就无法暂停直到它完成或调用异步函数.

基本上,用户选择多个复选框,然后点击一个按钮,执行其选择的AJAX处理.我的目标是拥有一个"Saving ..."图标,该图标仅在所有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.');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

And*_*rle 2

JavaScript 中只有一个线程,因此每个想要执行的函数都被放入堆栈中,并且必须等待所有其他函数都执行完毕。在您的情况下,“each”是堆栈中的第一个函数,因此每个回调函数都必须等待并将按照它们放入堆栈的顺序执行。毕竟“numProcessed == toProcess”只能有一次为真。