Di Javascript, ada yang sinkron dan asinkron fungsi .
Fungsi Sinkron
Sebagian besar fungsi dalam Javascript bersifat sinkron. Jika Anda memanggil beberapa fungsi sinkron berturut-turut
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
mereka akan mengeksekusi secara berurutan. doSomethingElse
tidak akan mulai sampai doSomething
selesai. doSomethingUsefulThisTime
, pada gilirannya, tidak akan mulai sampai doSomethingElse
selesai.
Fungsi Asinkron
Fungsi asinkron, bagaimanapun, tidak akan menunggu satu sama lain. Mari kita lihat contoh kode yang sama dengan yang kita miliki di atas, kali ini dengan asumsi bahwa fungsinya tidak sinkron
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Fungsi-fungsi akan diinisialisasi secara berurutan, tetapi semuanya akan dieksekusi secara kasar pada saat yang sama. Anda tidak dapat secara konsisten memprediksi yang mana yang akan selesai lebih dulu: yang terjadi untuk mengambil jumlah waktu terpendek untuk mengeksekusi akan selesai terlebih dahulu.
Tetapi kadang-kadang, Anda ingin menjalankan fungsi yang tidak sinkron secara berurutan, dan kadang-kadang Anda ingin fungsi yang sinkron dijalankan secara tidak sinkron. Untungnya, ini dimungkinkan dengan callback dan timeout, masing-masing.
Telepon balik
Mari kita asumsikan bahwa kita memiliki tiga fungsi asynchronous bahwa kita ingin mengeksekusi dalam rangka, some_3secs_function
, some_5secs_function
, dan some_8secs_function
.
Karena fungsi dapat diteruskan sebagai argumen dalam Javascript, Anda bisa meneruskan fungsi sebagai panggilan balik untuk dieksekusi setelah fungsi selesai.
Jika kita membuat fungsi seperti ini
function some_3secs_function(value, callback){
//do stuff
callback();
}
maka Anda dapat menghubungi secara berurutan, seperti ini:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
Batas waktu
Di Javascript, Anda bisa memberi tahu fungsi untuk dijalankan setelah batas waktu tertentu (dalam milidetik). Ini dapat, pada dasarnya, membuat fungsi sinkron berperilaku tidak sinkron.
Jika kita memiliki tiga fungsi sinkron, kita dapat menjalankannya secara tidak sinkron menggunakan setTimeout
fungsi tersebut.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Namun, ini agak jelek dan melanggar prinsip KERING [wikipedia] . Kita bisa membersihkan ini sedikit dengan membuat fungsi yang menerima larik fungsi dan batas waktu.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Ini bisa disebut seperti ini:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
Singkatnya, jika Anda memiliki fungsi asinkron yang ingin Anda jalankan secara sinkron, gunakan panggilan balik, dan jika Anda memiliki fungsi sinkron yang ingin Anda jalankan secara tidak sinkron, gunakan timeout.