Skip to main content

Cara Membuat Callback Function di Javascript

Hal yang membuat bingung ketika kita bekerja dengan synchronous dan asynchronous program adalah bagaimana menangani suatu nilai yang didapatkan secara asynchronous pada program yang berjalan secara synchronous. 


Contohnya seperti kode berikut:

  1. const getCake = () => {

  2.  let cake = null;

  3.  console.log("Sedang membuat kue, silakan tunggu ....")

  4.  setTimeout(() => {

  5.    cake = "Kue Selesai!"

  6.  }, 3000)

  7.  return cake;

  8. }

  9.  

  10. const cake = getCake();

  11. console.log(cake);

  12.  

  13. /*output:

  14. Sedang membuat kue, silakan tunggu ....

  15. null

  16. */


Jika kita melakukan hal seperti ini untuk mencetak nilai cake yang sesungguhnya, maka hal tersebut tidak akan pernah terjadi. Karena seperti yang sudah kita ketahui fungsi setTimeout() tidak akan menghentikan JavaScript untuk mengeksekusi kode yang ada selanjutnya. Jadi fungsi getCake() akan selalu mengembalikan nilai null, karena kode return cake akan dieksekusi terlebih dahulu dibandingkan dengan cake = “Kue Selesai!”. Kode asynchronous perlu disusun dengan cara yang berbeda dari synchronous code. Cara paling dasar adalah dengan menggunakan callback function.
Apa itu callback function? Mari kita bayangkan kembali melalui pandangan dunia nyata. Kita menunggu pesanan kopi datang di meja kita tapi , pada saat itu juga kita tidak bisa berada terus di tempat itu karena ada urusan mendadak. Pada kasus ini mungkin terdapat dua aksi yang bisa kita lakukan:
  • (Synchronous) Kita tetap menunggu di meja hingga kopi itu datang dan kemudian meninggalkan kedai kopi.
  • (Asynchronous) Kita meminta tolong kepada teman kita untuk menerima kopi itu, dan bertemu nanti untuk memberikan kopinya. Sehingga kita tidak perlu menunggu untuk meninggalkan kedai kopi.
Nah pada JavaScript, teman kita berperan layaknya callback function. Ia diperintahkan pada sebuah fungsi asynchronous kemudian akan dipanggil/digunakan ketika tugas itu selesai.
Bagaimana cara melakukannya? Yang pertama kita tambahkan parameter dengan nama callback pada fungsi asynchronous.

  1. const getCake = callback => {

  2.  let cake = null;

  3.  console.log("Sedang membuat kue, silakan tunggu ....")

  4.  setTimeout(() => {

  5.    cake = "Kue Selesai!";

  6.  }, 3000)

  7.  return cake;

  8. }


Kemudian kita panggil/gunakan callback yang diisikan dengan data yang akan dibawa (cake) ketika task selesai dilakukan.

  1. setTimeout(function() {

  2.    cake = "Kue Selesai!";

  3.    callback(cake);

  4. }, 3000)


Setelah menggunakan callback, fungsi tidak perlu lagi mengembalikan nilai. Sehingga kita bisa hapus kode return cake;. Sehingga keseluruhan fungsi akan tampak seperti ini:

  1. const getCake = callback => {

  2.  let cake = null;

  3.  console.log("Sedang membuat kue, silakan tunggu ....")

  4.  setTimeout(() => {

  5.    cake = "Kue Selesai!";

  6.    callback(cake);

  7.  }, 3000)

  8. }


Kemudian untuk menggunakan fungsi getCake, kita ubah kode dari:

  1. const cake = getCake();

  2. console.log(cake);


Menjadi:

  1. getCake(cake => {

  2.  console.log(cake);

  3. })


Sehingga ketika dijalankan akan sesuai dengan harapan kita.

  1. const getCake = callback => {

  2.  let cake = null;

  3.  console.log("Sedang membuat kue, silakan tunggu ....")

  4.  setTimeout(() => {

  5.    cake = "Kue Selesai!";

  6.    callback(cake);

  7.  }, 3000)

  8. }

  9.  

  10. getCake(cake => {

  11.  console.log(cake);

  12. })

  13.  

  14. /* output:

  15. Sedang membuat kue, silakan tunggu ....

  16. ---- setelah 3 detik ----

  17. Kue Selesai!

  18. */



Callback Hell

Kita sudah mengetahui bahwa callback dibutuhkan untuk mendapatkan nilai yang berasal dari asynchronous function. Lantas bagaimana jika terdapat proses satu sama lain yang saling bergantungan? Contohnya, untuk membuat kue tahapan yang perlu kita lakukan adalah:
  1. Mempersiapkan bahan
  2. Membuat adonan
  3. Menyiapkan adonan ke cetakan
  4. Memanggang adonan
Tahapan tersebut sangat tergantung satu sama lain. Kita tidak bisa memanggang adonan sebelum membuat adonannya, dan kita tidak bisa membuat adonan tanpa mempersiapkan bahannya terlebih dahulu. Jika seluruh tahapan tersebut berjalan secara synchronous, mungkin kita bisa melakukanya seperti ini:

  1. function makeACake(...rawIngredients) {

  2.  const ingredients = gatheringIngredients(rawIngredients),

  3.  dough = makeTheDough(ingredients),

  4.  pouredDough = pourDough(dough),

  5.  cake = bakeACake(pourDough),

  6.  console.log(cake);

  7. }


Namun jika fungsi-fungsi tersebut berjalan secara asynchronous, maka kita akan membuat yang namanya callback hell. Callback hell terjadi karena banyak sekali callback function yang bersarang karena saling membutuhkan satu sama lain, sehingga kode akan tampak seperti ini:

  1. function makeACake(...rawIngredients) {

  2.  gatheringIngredients(rawIngredients, function(ingridients) {

  3.    makeTheDough(ingridients, function(dough) {

  4.      pourDough(dough, function(pouredDough) {

  5.        bakeACake(pouredDough, function(cake) {

  6.          console.log(cake);

  7.        });

  8.      });

  9.    });

  10.  });

  11. }


Melihat kode seperti ini saja, kepala jadi pusing. Terbayang sulitnya memelihara kode ini di masa yang akan datang.
Lantas apa solusi agar kita dapat menghindari callback hell? Salah satunya adalah dengan menggunakan Promise.

  1. function makeACake(...rawIngredients) {

  2.  gatheringIngredients(rawIngredients)

  3.  .then(makeTheDough)

  4.  .then(pourDough)

  5.  .then(bakeACake)

  6.  .then(console.log);

  7. }


Dengan Promise, kita dapat meminimalisir callback hell dan mengubahnya menjadi kode yang sangat mudah dibaca. Bahkan dengan kode seperti itu, non-developer pun dapat mengerti apa maksud dari kode tersebut

Comments

Popular posts from this blog

Contoh Menggunakan API Dan Fetch di dalam Web Sederhana

Apakah Anda sudah berhasil menerapkan Fetch dalam menampilkan data dari API TheSportDB? Jika belum, yuk kita lakukan bersama-sama! Pada dokumentasi API menyebutkan bahwa, untuk mendapatkan daftar klub olahraga kita dapat menggunakan target url:  https://www.thesportsdb.com/api/v1/json/1/searchteams.php?t=Arsenal Sebelum menuliskan langsung pada proyek dengan fetch, biasakan ketika hendak mengkonsumsi API biasakan untuk mencobanya menggunakan aplikasi Postman terlebih dahulu. Jika target url tersebut diakses melalui Postman dengan GET Request, maka akan menghasilkan response dengan struktur JSON yang tampak pada  tab Body . Pada response JSON yang dihasilkan menampung satu  key  dengan nama  teams  yang memiliki  value  berupa sebuah array. Di dalam array tersebut menampilkan banyak data terkait klub olahraga yang memiliki nama Arsenal. Kita dapat memanfaatkan key  strTeam  untuk mendapatkan nama klub,  strTeamBadge  untuk mendapatkan logo klub, dan  strDescriptionEN  untuk mendapatkan

Contoh Penggunaan Default Parameters Di Javascript

Dengan menggunakan default parameters, nilai pada parameter tidak akan menghasilkan  undefined  walaupun kita tidak memberikan nilai ketika fungsi tersebut dipanggil. Default parameter dapat digunakan pada regular function ataupun arrow function. Berikut contoh dari penggunaan default parameter: Regular Function function sayHello ( name = "Stranger" , greet = "Hello" ) {     console . log ( `${greet} ${name}!` ); }   sayHello ( "Dimas" ,   "Hai" ); sayHello ();   /* output: Hai Dimas! Hello Stranger! */ Arrow Function const sayHello = ( name = "Stranger" , greet = "Hello" ) => console . log ( `${greet} ${name}!` );     sayHello ( "Dimas" ,   "Hai" ); sayHello ();     /* output: Hai Dimas! Hello Stranger! */ Pada contoh di atas, kita menggunakan tanda assignment (=) untuk menetapkan parameter  name  dengan nilai default  “Stranger” , dan parameter greet dengan nilai default  “Hello” . Hal ini

Belajar Babel Loader Javascript ES6

Apa itu  babel  atau  babel.js ? Babel merupakan sebuah transpiler yang bertugas untuk mengubah sintaks JavaScript modern (ES6+) menjadi sintaks yang dapat didukung penuh oleh seluruh browser. JavaScript merupakan bahasa pemrograman yang berkembang sangat pesat. Komunitasnya besar, dan tiap tahun selalu terdapat versi yang baru.  Namun perkembangan yang pesat tadi ternyata membutuhkan waktu yang lama untuk diadaptasi oleh browser atau Node.js. Lalu jika kita ingin mencoba sintaks terbaru di JavaScript apakah kita perlu menunggu hingga seluruh browser berhasil mengadaptasi pembaharuan tersebut? Tentu tidak!  Dengan babel Anda dapat menuliskan sintaks JavaScript versi terbaru tanpa khawatir memikirkan dukungan pada browser. Karena babel akan mengubah sintaks yang kita tuliskan menjadi kode yang dapat diterima browser. Jika Anda penasaran bagaimana cara babel bekerja, babel menyediakan sebuah playground yang dapat kita manfaatkan untuk mengubah sintaks JavaScript modern (ES6+) menjadi sin