The "content is empty" is very confusing untuk programmer nodejs baru seperti ambe. |
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.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.
2. Print kandungan A.
3. Print "Hello World".
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; }