Selasa, 30 September 2014

#108: Asynchronous Programming

The "content is empty" is very confusing untuk programmer nodejs baru seperti ambe.
Akhir-akhir ini ambe belajar satu platform scripting language baru iaitu Node.js. Ia boleh dikatakan sebagai server-side JavaScript interpreter (biasanya JavaScript digunakan didalam web browser dan diembed bersama kod HTML. Manakala Node.js boleh beroperasi di luar browser). Node.js adalah berasaskan JavaScript engine dari web browser Google Chrome bernama V8.

Menjadi nature Node.js, Node.js adalah asynchronous. Bermakna Node.js adalah asynchronous secara default, walaubagaimanapun ia boleh diprogramkan untuk synchronous. Asynchronous boleh dibayangkan dengan perlumbaan F1 yang dilepaskan secara berturutan, tetapi kereta yang mana paling laju akan sampai dahulu, meninggalkan yang lambat. Contoh:
1. Baca fail dan simpan dalam variable A.
2. Print kandungan A.
3. Print "Hello World".
Diatas adalah 3 baris arahan ringkas. Untuk pengaturcaraan synchronous seperti kebanyakan programming language lain, output adalah kandungan A diikuti dengan perkataan "Hello World". Asynchronous pula sebaliknya. Disebabkan proses untuk membaca fail mengambil masa (walaupun hanya beberapa milisaat), Node.js tidak akan menunggu di baris 1. Ia akan teruskan execution dan anda mungkin akan mendapat output "Hello World" barulah diikuti dengan content A, jelas sekali melangkau sequence yang sepatutnya. Ini memberikan advantage kepantasan tanpa interruption yang mungkin disebabkan delay dalam proses I/O. Walaubagaimanapun, konsep ini sangat confusing bagi programmer baru yang sudah terbiasa dengan synchronous programming language seperti ambe.

Dibawah ini ambe cuba memprogramkan satu API untuk perkhidmatan email sementara Mailinator tetapi ambe menghadapi masaalah kerana output dari script ini adalah tidak seperti yang ambe maksudkan (lihat gambar diatas). Variable "a" disini sepatutnya mengandungi teks JSON dari API Mailinator. Sehingga sekarang ambe masih belum menjumpai jalan penyelesaiannya. Dari pengamatan ambe, ini terjadi mungkin disebabkan asynchronous nature pada Node.js.
var a= getMailinatorInbox("hunabku","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
console.log("content is:" , a);

function getMailinatorInbox(who,token){

var content="";
var options = {/*
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'*/
    host: "api.mailinator.com",
    path: "/api/inbox?token="+token+"&to="+who,
    method:"GET"
};

var req = https.request(options, function(res) {
  res.setEncoding('utf8');
  var chunks="";
  res.on('data', function (chunk) {
        chunks+=chunk;
  });
  res.on('end',function(){
      content=chunks;
});


});
req.end();
return content;
}

Tiada ulasan: