Karena javascript di browser adalah single thread (kecuali untuk webworkers yang tidak terlibat di sini) dan satu thread eksekusi javascript berjalan sampai selesai sebelum yang lain dapat berjalan, pernyataan Anda:
while(flag==false) {}
hanya akan berjalan selamanya (atau sampai browser mengeluh tentang loop javascript yang tidak responsif), halaman akan tampak digantung dan tidak ada javascript lain yang akan mendapatkan kesempatan untuk berjalan, sehingga nilai bendera tidak akan pernah dapat diubah.
Untuk penjelasan lebih lanjut, Javascript adalah bahasa yang digerakkan oleh peristiwa . Itu berarti bahwa ia menjalankan sepotong Javascript sampai ia mengembalikan kendali kembali ke penerjemah. Kemudian, hanya ketika kembali ke interpreter, Javascript mendapatkan event berikutnya dari antrian event dan menjalankannya.
Semua hal seperti pengatur waktu dan acara jaringan dijalankan melalui antrean acara. Jadi, ketika pengatur waktu aktif atau permintaan jaringan tiba, pengatur waktu tidak akan pernah "mengganggu" Javascript yang sedang berjalan. Alih-alih, sebuah acara dimasukkan ke dalam antrean acara Javascript dan kemudian, saat Javascript yang sedang berjalan selesai, acara berikutnya ditarik dari antrean acara dan gilirannya untuk dijalankan.
Jadi, ketika Anda melakukan pengulangan tak terbatas seperti while(flag==false) {}
, Javascript yang sedang berjalan tidak pernah selesai dan dengan demikian kejadian berikutnya tidak pernah ditarik dari antrian kejadian dan dengan demikian nilai flag
tidak pernah berubah. Kuncinya di sini adalah bahwa Javascript tidak didorong oleh interupsi . Ketika pengatur waktu menyala, itu tidak mengganggu Javascript yang sedang berjalan, menjalankan beberapa Javascript lain dan kemudian membiarkan Javascript yang sedang berjalan melanjutkan. Itu hanya dimasukkan ke dalam antrian acara menunggu sampai Javascript yang sedang berjalan selesai untuk mendapatkan gilirannya untuk dijalankan.
Yang perlu Anda lakukan adalah memikirkan kembali cara kerja kode Anda dan menemukan cara berbeda untuk memicu kode apa pun yang ingin Anda jalankan saat flag
nilainya berubah. Javascript dirancang sebagai bahasa yang digerakkan oleh peristiwa. Jadi, yang perlu Anda lakukan adalah mencari tahu peristiwa apa yang Anda minati sehingga Anda dapat mendengarkan peristiwa yang mungkin menyebabkan perubahan bendera dan Anda dapat memeriksa bendera pada peristiwa itu atau Anda dapat memicu peristiwa Anda sendiri dari kode apa pun yang mungkin mengubah bendera atau Anda dapat mengimplementasikan fungsi panggilan balik bahwa kode apa pun yang berubah bendera itu dapat memanggil callback Anda setiap kali bagian kode yang bertanggung jawab untuk mengubah nilai bendera akan mengubah nilainya menjadi true
, itu hanya memanggil fungsi panggilan balik dan dengan demikian kode Anda yang ingin dijalankan saat bendera disetel ketrue
akan dijalankan pada waktu yang tepat. Ini jauh lebih efisien daripada mencoba menggunakan semacam pengatur waktu untuk terus-menerus memeriksa nilai bendera.
function codeThatMightChangeFlag(callback) {
if (condition happens to change flag value) {
callback();
}
}
jQuery.Deferred
,Q
,async
, ...