Asynchronous dan Control Flow di Node

Halo kakak, pada kesempatan kali ini mari kita membahas sedikit tentang Async dan juga Control Flow di Node sesuai janji saya pada tutorial sebelumnya.

Asynchronous berarti dapat mengeksekusi operasi I/O secara paralel, jadi sebuah operasi I/O tidak harus menunggu selesai mendapat response sehingga bisa melanjutkan ke operasi selanjutnya.

Untuk lebih jelasnya tentang Asynchronous mari kita menyimak sebuah cerita di negeri antah berantah sebagai berikut :

Ini cerita tentang Dian seorang hijaber yang baik hati, manis, single dan sedang menyongsong masa depan.

Dian mendirikan sebuah restoran fastfood baru di kota, namanya “Node Fried Tempe” disingkat NFT. Karena masih baru maka hanya disediakan satu konter saja yang melayani pembeli. Setelah acara pembukaan yang sederhana, beberapa hari kemudian pembeli mulai berdatangan, di NFT pembeli bisa memilih beberapa macam paket makanan yang disediakan, setelah selesai memilih kemudian pembeli membayar di kasir. Restoran berjalan dengan lancar, dan pembeli baru pun mulai ramai berdatangan walaupun dengan nol biaya marketing, huwooow~.

Resto NFT mulai terkenal, beberapa remaja alay nan hipster pun mulai datang untuk mencoba makanan di NFT. Namun ternyata muncul sebuah permasalahan , yaitu para remaja tersebut terlalu lama dan labil saat memilih paket makanan, terlalu banyak bertanya, dan rebyek (cerewet) banget semacam :

“paket yang paling enak mana kak?”

“kalau tempe nya digoreng setengah matang boleh ga kak?”

“teh nya yang nasgitel ya kak, panas, legi, gatel *ckikik, ckikik”

“yang paket 1 kak, eh ga ding, yang paket 2 aj, tapi sepertinya paket 3 lebih enak ya kak?”

Hal ini petugas konter kewalahan dan menyebabkan antrian tersendat. Para remaja ini mulai sering datang sebagai pelanggan namun kelakuannya tidak berubah.

Hmmm, Dian mulai memikirkan solusi yang terbaik.

Khawatir dengan kesehatan petugas konter nya, Dian membuat beberapa konter tambahan menjadi 5 konter agar antrian tidak menjadi terlalu panjang. Nampaknya solusi tersebut cukup sukses dan antrian yg tadinya tersendat pun mulai sirna. Bravo~

Seiring dengan waktu, usaha dan doa, NFT semakin terkenal dan ternyata banyak remaja dan om alay yang ikut menjadi pelanggan baru di NFT, tidak bisa dipungkiri bahwa tempe goreng yang nikmat dan bergizi disukai manusia dalam masa pertumbuhan. Akhirnya antrian di setiap konter menjadi tersendat lagi. Hal ini tentu saja tidak bisa dibiarkan terus menerus. Walaupun alay dan rewel namun mereka adalah pelanggan juga, customer is the king toh!!!.

Dian harus memutar otak kembali  (fyi, Dian benar2 memutar otak dengan cara koprol).

Untuk menambah jumlah konter tidak memungkinkan karena tempat yg terbatas, jadi Dian mulai memikirkan solusi dari akar masalahnya yaitu para pembeli yang lama dan labil memilih paket makanan !.

Hmmmm. Akhirnya Dian membuat semacam aturan yang tegas, yaitu menyediakan tempat khusus di samping antrian tiap konter untuk pembeli yg masih bingung dalam memilih paket menu. Jika pembeli tidak dapat memutuskan memilih menu yang mana dalam 20 detik, maka sementara dipersilahkan berdiri di tempat khusus tersebut. Jika sudah memutuskan menu yang dipilih, pembeli tersebut boleh langsung memesan ke petugas konter. Dengan aturan tersebut maka pembeli tetap dilayani dengan baik tanpa harus membuat pengantri selanjutnya menunggu terlalu lama.

Wow,  itu solusi cerdas dari dek Dian :3 . Sebenarnya konsep Async pun mirip seperti cerita diatas, setiap pembeli yang datang adalah operasi yang harus dieksekusi oleh program. Untuk operasi yang membutuhkan waktu lama seperti operasi I/O (digambarkan sbg remaja alay nan labil), tidak harus menunggu sampai operasi tersebut selesai, operasi selanjutnya dapat langsung mulai dieksekusi. Setelah operasi tersebut selesai maka ada fungsi yang menghandle hasil dari operasi tersebut. Hal ini membuat program cukup efektif karena mengurangi cpu yang menganggur selama menunggu operasi I/O.

Untuk pemrograman di dalam lingkungan Async tentu membutuhkan control flow yang berbeda dengan lingkungan Sync. Hal ini yang sebenarnya cukup membuat kesulitan programmer yg terbiasa dengan pemrograman Sync. Beberapa control flow yang digunakan untuk membuat program di lingkungan Async semacam Node dan Javascript adalah Callback, EventEmitter dan Promise.

Callback

Kita tentu terbiasa dengan callback, callback adalah fungsi yang digunakan sebagai event handler, jika sebuah event muncul maka callback akan dieksekusi

fungsiAsync(arg1, function(err, data){
    // implementasi
});

callback merupakan control flow paling sederhana di lingkungan Async, karena sederhana maka untuk diimplementasikan di dalam program yang cukup besar kemungkinan bisa mengakibatkan kode susah di baca jika tidak hati-hati. Karena itu beberapa programmer berusaha membuat semacam abstraksi di atas callback untuk membantu mempermudah membuat kode yang lebih mudah dibaca.

EventEmitter

EventEmitter ini mirip dengan konsep Pub-Sub dan Observer Pattern, dimana suatu instance yang telah mengimplementasikan EventEmitter dapat membuat custom event, dan kemudian memasang fungsi untuk menghandle event tersebut. Susah menjelaskannya ya, coba deh dilihat sample kode berikut

var ee = require('events');

var objKu = new ee.EventEmitter();

objKu.on('senggol', function() {
    console.log('bacok');
});

objKu.emit('senggol');

Kode diatas adalah instance dari EventEmitter yang mempunyai event ‘senggol’ yang dipasangkan dengan sebuah callback. Maka jika suatu saat di dalam program, event ‘senggol’ tersebut di sulut / trigger, maka callback tersebut akan dipanggil. EventEmitter dapat membuat control flow menjadi lebih gampang dibaca ketimbang jika hanya menggunakan callback saja, terutama jika terdapat  callback yg bercabang, atau nested yang membuat kode seperti piramid temumplak.

Mari kita coba EventEmitter lebih jauh

var ee = require('events');
var util = require('util');

var Hewan = function() {

	var self = this;

	this.berlari = function() {
		self.emit('run');
	}

	this.melompat = function() {
		self.emit('jump');
	}

	this.tidur = function() {
		self.emit('sleep');
	}
};

util.inherits(Hewan, ee.EventEmitter);

var kucing = new Hewan();

kucing.on('run', function() {
	console.log("clingak clinguk");
	console.log("mlayu banter");
});

kucing.on('sleep', function() {
	console.log("angop trus merem");
});

kucing.berlari();
kucing.tidur();

Kode diatas adalah object Hewan yang mewarisi sifat EventEmitter sehingga kita bisa membuat custom event di dalam object Hewan. Kita dapat memasang implementasi callback berdasar event yg sudah ditentukan.

Promise

Promise sebenarnya bukan hal yang baru, konon dulu pernah diimplement oleh NodeJS versi awal namun krn perang yg berkepanjangan *lebay, fitur ini tidak jadi dimasukkan dalam Node dan dihilangkan di versi Node selanjutnya, untuk penggunaannya diserahkan kepada user utk mengimplementasikannya.

Berbeda dengan biasanya, callback dimasukkan di dalam sebuah fungsi itu sendiri melalui argument, namun untuk ini callback dimasukkan di dalam object kembalian fungsi tersebut. Nah, object itulah yg bernama promises. Untuk lebih jelasnya bisa dilihat di perbedaan dalam implementasi callback dan promise.

// callback
fungsiAsync(function (err, data) {
	if (err) return console.error(err)
	console.log(data)
})

// promise
var promise = fungsiAsync()
promise.then(console.log, console.error)

Sekilas tidak ada banyak perbedaan namun kita akan bahas promise ini lebih lanjut di tutorial selanjutnya.

Dengan penggunaan beberapa control flow diatas semoga dapat membantu kita dalam membuat kode program yang lebih mudah dibaca manusia lain. gitu~

semoga bermanfaat.

Leave a Reply

Your email address will not be published. Required fields are marked *