ภายใน Node.js นั่น การทำงานเป็นแบบ Asynchronous เป็นหลัก คือการทำงานแบบไม่รอผลลัพธ์ที่ตอบกลับมา โดยจะไปทำคำสั่งต่อไปในทันที เมื่อผลลัพธ์ส่งกลับมาจะมาเรียก Callback Function ให้ทำงาน แตกต่างกับการทำงานแบบ Synchronous ที่ต้องรอผลลัพธ์ส่งกลับมาก่อนเสมอ ถึงค่อยทำคำสั่งต่อไปได้ การทำงานแบบ Asynchronous & Callback ใน Node.js นั่นมีมี Event Loop เป็นตัวควบคุม
Callback (การเรียกกลับ)
เพื่อให้เข้าใจการทำงานแบบ Asynchronous, Synchronous เริ่มต้นลองสร้างไฟล์ input.txt ไว้ใน Project พิมพ์ข้อความลงไปเป็นอะไรก็ได้ ตัวอย่างเช่น
This is a Node.js. It is not difficult.
But You try to code with Node.js. Okay.
เราจะมาเขียนโค้ดให้ Node.js อ่านข้อความจากไฟล์ แสดงบนออกมาหน้าจอ Console กัน
Blocking
เขียนแบบ Synchronous สร้างไฟล์ blocking-code.js แล้วใส่โค้ดตามด้านล่างเพื่อ ทดสอบการทำงานแบบ Synchronous
var fs = require("fs");
var data = fs.readFileSync('input.txt'); // WAIT UNTIL READ FILE FINISH
console.log(data.toString());
console.log("----- Ended -----");
เรียกให้ blocking-code.js ทำงาน
$ node blocking-code.js
ผลลัพธ์
This is a Node.js. It is not difficult.
But You try to code with Node.js. Okay.
----- Ended -----
สังเกตุว่า ข้อความในไฟล์แสดงก่อนคำว่า ----- Ended ----- ตามลำดับคำสั่งที่เราเขียนขึ้น
Non-Blocking
เขียนแบบ Asynchronous สร้างไฟล์ non-blocking-code.js แล้วใส่โค้ดตามด้านล่างเพื่อ ทดสอบการทำงานแบบ Asynchronous
var fs = require("fs");
fs.readFile('input.txt', function (err, data) { // CALLBACK FUNCTION
if (err) return console.error(err);
console.log(data.toString());
});
console.log("----- Ended -----");
เรียกให้ non-blocking-code.js ทำงาน
$ node non-blocking-code.js
ผลลัพธ์
----- Ended -----
This is a Node.js. It is not difficult.
But You try to code with Node.js. Okay.
สังเกตุว่า ข้อความ ----- Ended ----- แสดงผลก่อนแล้วตามด้วยข้อความในไฟล์ ไม่เกิดการรอ
ภายใน Node.js ที่มี Modules ต่างๆ ให้เราเรียกใช้งานส่วนใหญ่แล้วเป็นแบบ Asynchronous และ Callback ดังนั้นถ้าเราเข้าใจ Concept นี้ การเขียนแอพพลิเคชั่นบน Node.js ก็ไม่ยากเกินความสามารถครับ