5

Birden fazla (diyelim) ajax çağrıları yaptığım bir durum var (AngularJS http get'i kullanarak, eğer önemliyse) ve her bir aramayı geri çağırmak ve bir sayacı arttırmak istiyorum, böylece ne zaman (4) iş parçacığı tamamlandı.Tarayıcıda JavaScript'te eşzamanlı bir okuma/yazma okuma/yazma çarpması mümkün mü?

Yazıcım, Java'nın "senkronize" veya "uçucu" anahtar kelimelerle karşılaştırılabilir bir şeye sahip olmadığı için, birden fazla eşzamanlı iş parçacığının bir sayacı artırma sırasında çarpışmasının mümkün olacağı ve böylelikle bazı artışların eksik olacağıdır. Diğer bir deyişle, iki iş parçacığı aynı anda gelir ve her ikisi de aynı değeri (örneğin, 100) alarak sayaçları okur. Sonra her iki iş parçacığı (101'e) artırır ve yeni değeri saklar ve bir sayıyı (102 yerine 101) kaçırdık!

JavaScript'in tek iş parçacıklı olması gerektiğini biliyorum, ancak istisnalar var.

Tarayıcıda bu durum mümkün mü ve eğer öyleyse, buna karşı korunmanın bir yolu var mı?

+3

Sözler nedeniyle bir sayaç gerek yok. $ Q.all() 'a bir göz atın. $ $ $ bir söz verir ve bir dizi sözler sarılabilir ve hepsi tamamlandığında, AFAIR, ben asla bir cevap bekliyorum – charlietfl

+0

tamamlandığında bitmiş çağrı! iyi soru! – shaheer

+1

@mplungjan çok yavaş olur – shaheer

cevap

4

Hayır, bu mümkün değil (çarpışma olmaz). Her AJAX çağrı cevabı, JavaScript mesaj sırasındaki bir mesaj olarak kabul edilebilir. JavaScript çalışma zamanı, sonraki işlenmeden önce sıradaki her iletiyi tamamlanma işlemine tabi tutar. Diğer bir deyişle, olayın geri çağrılmasını çağırır ve sıradaki bir sonraki iletiye geçmeden önce tam geri arama işlevini (ve çağırdığı tüm işlevleri vb.) Tamamlamaya çalışır. Bu nedenle, iki mesaj (örn. AJAX yanıtları) paralel olarak işlenmeyecektir.

Kaynak: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop

Ayrıca, uzun yıllar JavaScript çalıştık ve nasıl çalıştığını bu garanti edemez.

+0

Sana inanıyorum, ama biraz sağlayabilir misiniz iddianın için açıklama mı yoksa kaynak mı? –

+0

Harika bağlantı, teşekkürler! –

3

, javascript'in tek bir iş parçacığı olduğu için, böyle bir senaryo olacağını düşünmüyorum, js çok iş parçacıklı hale gelen tek yol, web işçileri kullandığınızda, ancak aynı değişkenleri paylaşmadıkları zaman bile. js sen i) burada varsayıyorum geçmesi nesneleri, böylece

düşününce DÜZENLEME

, orada söylemek okuma/yazma örtüşme her halükarda olmalıdır öznitelik bir demet yapacağını fonksiyonu onCounterIncreament olduğunu Eğer artar sonra hemen aramazsanız sayaç artışları, operasyonun sayaç sayacı, ancak sayaçta değişiklik olup olmadığını kontrol etmek için $watch veya bir zaman aşımı fn kullanın, bir değişikliği kaçıracağınız iyi bir olasılık vardır.

+0

Benim anlayışım tek iş parçacığı için istisnalar vardır .Örneğin, birden fazla ajax çağrısı aynı zamanda döndüğünde veya fare olayları ve benzerleri gibi, eş zamanlılık için –

+0

@VictorGrazi'nin güvenilirliğini sağlamak için gerekliyse, "JavaScript eşzamansız olabilir, bu doğrudur. Ancak WebWorkers olmadan temel JavaScript asla çok iş parçacıklı Bkz. Már Örlygsson'un yanıtı *** - http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – mido