Vaatlerle ilgili tek sorun IE'nin onları desteklememesi. Edge öyle, ancak orada çok sayıda IE 10 ve 11 var: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (altta uyumluluk)
Yani, JavaScript tek iş parçacıklı. Eşzamansız bir arama yapmıyorsanız, tahmin edilebilir şekilde davranacaktır. Ana JavaScript iş parçacığı, bir sonrakini çalıştırmadan önce kodda göründükleri sırayla bir işlevi tamamen yürütür. Eşzamanlı işlevler için garanti sırası önemsizdir - her işlev çağrıldığı sırayla tamamen yürütülür.
Senkron işlevi bir atomik iş birimi olarak düşünün . Ana JavaScript iş parçacığı, ifadeleri kodda göründüğü sırayla tam olarak yürütür.
Ancak, aşağıdaki durumda olduğu gibi asenkron çağrıyı atın:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Bu istediğinizi yapmaz . İşlev 1, işlev 2 ve işlev 3'ü anında yürütür. Div yanıp söner ve ajax çağrısı makeAjaxCall()
geri döndü bile, neredeyse tamamlanmadı . KOMPLİKASYON , makeAjaxCall()
çalışmalarını ana JavaScript iş parçacığının her dönüşünde yavaş yavaş gelişmiş parçalara böldü - asenkron olarak davranıyor. Ancak aynı ana iplik, bir sıkma / çalıştırma sırasında senkron bölümleri hızlı ve tahmin edilebilir bir şekilde yürüttü.
Yani, onu ele alma şeklim : Dediğim gibi bu fonksiyon atomik iş birimidir. İşlev 1 ve 2 kodunu birleştirdim - işlev 1 kodunu, zaman uyumsuz çağrıdan önce işlev 2'ye koydum. İşlev 1'den kurtuldum. Zaman uyumsuz çağrıyı içeren ve dahil olan her şey sırasıyla tahmin edilebilir şekilde yürütülür.
Daha sonra, eşzamansız arama tamamlandığında, ana JavaScript iş parçacığının birkaç kez döndükten sonra, işlev 3'ü çağırmasını sağlayın. Bu, siparişi garanti eder . Örneğin, ajax ile, onreadystatechange olay işleyicisi birden çok kez çağrılır. Tamamlandığını bildirdiğinde, istediğiniz son işlevi çağırın.
Daha karışık olduğuna katılıyorum. Ben simetrik kod sahip olmak gibi, fonksiyonları bir şey yapmak (ya da ona yakın) gibi ve herhangi bir şekilde (telefon arayan bir bağımlılık oluşturma) sorumlu olmak için ajax çağrısı sahip sevmiyorum. ANCAK, senkronize bir fonksiyona gömülü bir asenkron çağrı ile, yürütme sırasını garanti etmek için uzlaşmalar yapılmalıdır. Ve böylece hiçbir söz IE 10 kodlamak zorunda.
Özet : Senkronize çağrılar için sipariş garantisi önemlidir. Her işlev, çağrıldığı sırayla tam olarak yürütülür. Eşzamansız çağrıya sahip bir işlev için, siparişi garanti etmenin tek yolu, eşzamansız çağrının ne zaman tamamlandığını izlemek ve bu durum algılandığında üçüncü işlevi çağırmaktır.
JavaScript konuları hakkında bir tartışma için bkz. Https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 ve https://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
Ayrıca, bu konuda benzer, yüksek puan alan bir soru: 3 işlevi birbiri ardına yürütmek için nasıl çağırmalıyım?
firstFunction
tam olarak ne zaman uyumsuz hale getirir? Her iki şekilde de - sözleri kontrol et