Bir tarayıcıdaki javascript tek iş parçacıklı olduğundan (burada yer almayan web çalışanları hariç) ve bir javascript yürütme iş parçacığı, diğerinin çalışmadan önce tamamlanana kadar çalıştığı için, ifadeniz:
while(flag==false) {}
sonsuza kadar çalışacak (veya tarayıcı yanıt vermeyen bir javascript döngüsünden şikayet edene kadar), sayfa asılı görünecek ve başka hiçbir javascript çalıştırma şansı bulamayacak, bu nedenle bayrağın değeri asla değiştirilemez.
Biraz daha açıklama için, Javascript olay odaklı bir dildir . Bu, kontrolü yorumlayıcıya geri döndürene kadar bir Javascript parçası çalıştırdığı anlamına gelir. Ardından, yalnızca yorumlayıcıya geri döndüğünde, Javascript olay kuyruğundan bir sonraki olayı alır ve çalıştırır.
Zamanlayıcılar ve ağ olayları gibi her şey olay kuyruğunda çalışır. Dolayısıyla, bir zamanlayıcı çalıştırıldığında veya bir ağ isteği geldiğinde, o anda çalışan Javascript'i hiçbir zaman "kesintiye uğratmaz". Bunun yerine, Javascript olay kuyruğuna bir olay yerleştirilir ve daha sonra, o anda çalışan Javascript bittiğinde, bir sonraki olay olay kuyruğundan çekilir ve çalışma sırası gelir.
Yani, sonsuz bir döngü yaptığınızda while(flag==false) {}
, şu anda çalışan Javascript asla bitmez ve bu nedenle bir sonraki olay olay kuyruğundan asla çekilmez ve dolayısıyla değeri flag
asla değişmez. Buradaki anahtar, Javascript'in kesintiye dayalı olmamasıdır . Bir zamanlayıcı çalıştığında, o anda çalışan Javascript'i kesintiye uğratmaz, başka bir Javascript çalıştırır ve ardından o anda çalışan Javascript'in devam etmesine izin vermez. Sadece olay kuyruğuna konur ve o anda çalışan Javascript çalışma sırasının gelmesini bekleyin.
Yapmanız gereken, kodunuzun nasıl çalıştığını yeniden düşünmek ve flag
değer değiştiğinde çalıştırmak istediğiniz kodu tetiklemenin farklı bir yolunu bulmaktır . Javascript, olay odaklı bir dil olarak tasarlanmıştır. Yani yapmanız gereken şey, ilgilendiğiniz olayları kaydedebileceğiniz bulmaktır, böylece ya bayrağın değişmesine neden olabilecek olayı dinleyebilir ve o olaydaki bayrağı inceleyebilir ya da kendi etkinliğinizi başlatabilirsiniz. hangi kod bayrağı değiştirirse değiştirsin veya bayrak değerini değiştirmekten sorumlu kod parçası değerini değiştirdiğinde bu bayrak ne olursa olsun geri çağrınızı çağırabilecek bir geri arama işlevi uygulayabilirsiniz true
, yalnızca geri arama işlevini ve dolayısıyla kodunuzu çağırır bayrak ayarlandığında çalıştırmak isteyentrue
doğru zamanda çalıştırılacak. Bu, bayrak değerini sürekli kontrol etmek için bir çeşit zamanlayıcı kullanmaya çalışmaktan çok, çok daha etkilidir.
function codeThatMightChangeFlag(callback) {
if (condition happens to change flag value) {
callback();
}
}
jQuery.Deferred
,Q
,async
, ...