Satu-satunya masalah dengan janji adalah bahwa IE tidak mendukungnya. Edge melakukannya, tetapi ada banyak IE 10 dan 11 di luar sana: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (kompatibilitas di bagian bawah)
Jadi, JavaScript adalah utas tunggal. Jika Anda tidak melakukan panggilan asinkron, itu akan berperilaku terprediksi. Utas JavaScript utama akan menjalankan satu fungsi sepenuhnya sebelum menjalankan yang berikutnya, sesuai urutan yang muncul dalam kode. Jaminan pesanan untuk fungsi sinkron adalah sepele - setiap fungsi akan dieksekusi sepenuhnya dalam urutan yang dipanggil.
Pikirkan fungsi sinkron sebagai unit kerja atom . Utas JavaScript utama akan menjalankannya sepenuhnya, sesuai dengan urutan pernyataan yang muncul dalam kode.
Tapi, serahkan panggilan asinkron, seperti dalam situasi berikut:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Ini tidak melakukan apa yang Anda inginkan . Ini secara instan mengeksekusi fungsi 1, fungsi 2, dan fungsi 3. Memuat div berkedip dan hilang, sementara panggilan ajax hampir tidak lengkap, meskipun makeAjaxCall()
telah kembali. KOMPLIKASI yang makeAjaxCall()
telah memecah pekerjaannya menjadi potongan-potongan yang maju sedikit demi sedikit oleh setiap putaran utas JavaScript utama - itu berperilaku asikronik. Tetapi utas utama yang sama, selama satu putaran / putaran, mengeksekusi bagian sinkron dengan cepat dan dapat diprediksi.
Jadi, cara saya menanganinya : Seperti saya katakan fungsinya adalah unit atom. Saya menggabungkan kode fungsi 1 dan 2 - saya meletakkan kode fungsi 1 di fungsi 2, sebelum panggilan asynch. Saya menyingkirkan fungsi 1. Semuanya hingga dan termasuk panggilan asinkron dijalankan secara terprediksi, secara berurutan.
LALU, ketika panggilan asinkron selesai, setelah beberapa putaran utas JavaScript utama, memilikinya fungsi panggil 3. Ini menjamin pesanan . Misalnya, dengan ajax, pengendali event onreadystatechange disebut beberapa kali. Ketika melaporkannya selesai, maka panggil fungsi akhir yang Anda inginkan.
Saya setuju itu berantakan. Saya suka memiliki kode menjadi simetris, saya suka memiliki fungsi melakukan satu hal (atau dekat dengan itu), dan saya tidak suka memiliki panggilan ajax dengan cara apa pun bertanggung jawab atas tampilan (membuat ketergantungan pada penelepon). NAMUN, dengan panggilan asinkron yang tertanam dalam fungsi sinkron, kompromi harus dilakukan untuk menjamin urutan eksekusi. Dan saya harus kode untuk IE 10 jadi tidak ada janji.
Rangkuman : Untuk panggilan sinkron, jaminan pesanan itu sepele. Setiap fungsi dieksekusi sepenuhnya dalam urutan yang disebutnya. Untuk fungsi dengan panggilan asinkron, satu-satunya cara untuk menjamin pesanan adalah dengan memonitor ketika panggilan async selesai, dan memanggil fungsi ketiga saat kondisi itu terdeteksi.
Untuk diskusi tentang utas JavaScript, lihat: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 dan https://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
Juga, pertanyaan serupa lainnya yang berperingkat tinggi tentang hal ini: Bagaimana saya harus memanggil 3 fungsi untuk menjalankannya satu demi satu?
firstFunction
sebenarnya yang membuatnya tidak sinkron? Either way - periksa tentang janji