Existuje nějaká možnost, že by dvě instance asynchronní funkce Javascriptu spouštěly dva bloky kódu současně?

Chápu, že Javascript nemá více vláken, ale rád bych věděl, jestli má následující kód šanci na rozbití. Chápu to tak, že pokud není volána asynchronní funkce, jako je setTimeout nebo volání AJAX, že jakmile se blok kódu začne provádět, neexistuje způsob, jak jej pozastavit, dokud se nedokončí nebo nezavolá asynchronní funkci.

V zásadě uživatelé zaškrtnou více políček a poté stisknou tlačítko, které provede AJAX zpracování jejich výběru. Mým cílem je mít ikonu „Ukládání…“, která zůstane zobrazena pouze do dokončení všech procesů AJAX a po dokončení zobrazí zprávu o úspěchu.

Zablokování jakýchkoli chyb AJAX, pokud je funkce zpětného volání v jQuery.post spustí se v plném rozsahu bez přerušení, nechápu, jak if(numProcessed == toProcess) by se kdy provedl více než jednou nebo méně než jednou. Pokud se však do funkce zpětného volání dostanou dvě zpětná volání AJAX, obě zvýší numProcessed čítač, než se buď dostanete na následující if , pak se zdá, že kód uvnitř by byl proveden dvakrát.

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.');
    }
  }
}

Odpověď

V JavaScriptu je pouze jedno vlákno, takže každá funkce, kterou chcete provést, je vložena do zásobníku a musí se čekat, dokud nebudou provedeny všechny ostatní. Ve vašem případě je „každý“ první funkcí v zásobníku, takže každá funkce zpětného volání musí čekat a bude provedena v pořadí, v jakém je vloží do zásobníku. Nakonec „numProcessed ==toProcess“ může být pravdivé pouze jednou.