Các bước khởi đầu để bạn Viết NodeJS

Các bước khởi đầu để bạn Viết NodeJS

Như tiêu đề, bài này mình viết với mục đích giới thiệu về javascript với các bạn.

Vâng, giới thiệu về javascript. Sẽ có nhiều người thắc mắc "javascript thì cần gì giới thiệu!". Hàng ngày, hàng giờ mọi web developer đều phải làm việc với js và nó trở thành ngôn ngữ quá quen thuộc với bạn. Nhưng bạn ơi! bạn hãy thử nghĩ xem, từ trước đến giờ, bạn đã viết những gì với js?

Bạn làm cho một số thứ chuyển động, thay đổi màu sắc, bạn làm cho mã HTML linh hoạt hơn, bạn thêm tag này, bỏ tag kia bằng js. Nói tóm lại, với js, bạn làm cho trang web của bạn thêm màu mè và nhiều hiệu ứng . Bạn, từ những ngày đầu viết web đến giờ vẫn mãi là JAVASCRIPT USER. Có thể bạn dùng một vài framework cho js như jQuery chẳng hạn, có thể bạn viết một vài plug-in cho jQuery nhưng, mục đích cuối cùng vẫn vậy: bạn dùng js để can thiệp vào HTML ở mức độ sơ khai nhất!

Nhưng hoàn cảnh sẽ khác khi bạn viết Node, khi mà javascript nằm ở phía server, khi mà javascript làm công việc nhận httprequest, trả httpresponse, kết nối đến CSDL, xử lý upload, streamming v.v...! Bạn sẽ phải viết js dưới một góc độ khác - góc độ một JAVASCRIPT DEVELOPER.

Để hiểu bài viết này, bạn chỉ cần có kiến thức lập trình căn bản, và... căn bản.

I. HÀM TRONG JAVASCRIPT

Mình không nói hàm là gì nữa nhé. Chỉ có một điều bạn phải luôn tâm niệm khi viết hàm trong javascript: Hàm - cũng chỉ là biến! Nói cách khác, bạn có thể viết js như sau:

function say() {
    alert('Hello world from JavaScript!');
    return 'Hello world!';
}
 
var message = say();
 
var greeting = say;
 
greeting(); //Hello world from JavaScript!
alert('JavaScript says: '+message); //JavaScript says: Hello world!

Bạn có thể thấy đoạn mã: var message = say() mang ý nghĩa: message là một biến mang giá trị do hàm say() trả về. Còn đoạn mã thứ hai: var greeting = say lại mang ý nghĩa hoàn toàn khác: greeting là say, nó với cách hiểu đơn giản nhất chính là phương thức truyền giá trị cho một biến. Với những ai đã từng viết C, thì khái niệm con trỏ hàm của C khá giống với trường hợp này.

Cũng vì lý do này, khái niệm hàm vô danh ra đời:

var greeting = function(){
    alert('Hello world from JavaScript!');
    return 'Hello world!';
}

với ý nghĩa: greeting mang giá trị là hàm theo kiểu định nghĩa 'này'. Tóm lại, ta chỉ quan tâm đến định nghĩa hàm đó, chứ ta không cần biết hàm đó tên là gì - mà thực ra, tên của nó chính là 'greeting'. Mình khuyến khích các bạn viết hàm theo cách này, bạn sẽ hiểu chính xác hơn phương thức mà js làm việc với hàm.

Bạn cũng đã bắt gặp cách viết này khi bạn làm việc với jQuery:

PHP:

$(document).ready(function(){
alert('It's ready!');
})

Giống như mình hồi đó, mình rất bỡ ngỡ khi mà cả một khối hàm được nằm trong một call của hàm khác! Nhưng mình tin, bây giờ bạn đã hiểu rõ vì sao!

II. HÀM GỌI LẠI - CALLBACK FUNCTION

Ta hãy bắt đầu bằng đoạn mã jQuery sau:

$(document).ready(function(){
    alert('I\'m ready!');
})
alert('Am I ready?');

Bạn thử đoán xem đoạn alert nào sẽ được browser popup ra trước? Bạn, nếu đã là người có kinh nghiệm hẳn sẽ đoán được kết quả. Còn nếu không, hãy thử chèn code này vào một trang HTML rồi test, bạn cũng sẽ thấy được kết quả rõ ràng: "Am I ready?" là alert xuất hiện trước. Code sau, nhưng xuất hiện trước. Đây chính là biểu hiện của lập trình hướng sự kiện - kèm theo đó là các hàm gọi lại (callback functions). Hãy cùng phân tích đoạn code trên:

$(document).ready(callback) đây là hàm dùng để xử lý sự kiện khi trang HTML của bạn được load hoàn toàn còn biến đầu vào callback chính là một hàm vô danh (bạn còn nhớ phần I đúng không) dùng để xử lý SAU KHI sự kiện load hoàn toàn trang HTML xảy ra. Còn đoạn mã alert('Am I ready?') sẽ được thực thi ngay khi phần mã javascript được load xong, kết quả tiến trình xử lý sẽ như sau:

Trang HTML bắt đầu load -> load xong đoạn mã javascript -> thực thi luôn lệnh alert('Am I ready?') -> load tiếp các phần còn lại của trang -> load thành công trang web -> thực thi lệnh alert('I'm ready!').

Việc coi một hàm như một biến chính là cách mà javascript truyền một đoạn tác vụ xử lý vào bên trong một khối hàm nào đó. Và đoạn tác vụ xử lý đó được gọi với tên callback. Ứng dụng của việc này chính là: callback sẽ đóng vai trò xử lý những tác vụ mà "ta không biết trước khi nào phải xử lý". Tuy nhiên, để thực sự hiểu về callback, bạn cần TRÁNH các sai lầm sau khi lập trình javascript:

Dùng callback để lấy một kết quả nào đó ra bên ngoài: Nói khác đi, bạn dùng return. Ví dụ cho dễ hiểu nhé:

Trong lúc dùng ajax:

$.ajax('some/web/address').done(function(data){
    return data; // ??
})

vấn đề ở chỗ, mình thấy nhiều bạn muốn lấy biến data ra ngoài phương thức done() nên đã thêm mã return data. Bạn return đi đâu? return qua một hàm vô danh? vậy bạn call hàm đó bằng cách nào? Một số kiên trì hơn đã viết theo cách này:

var getAjaxData = function(data){
return data;
}
 
$.ajax('some/web/address').done(getAjaxData);
 
var theData = getAjaxData();
alert(theData) // undefined

bạn có thể thử! Bạn nên hiểu như sau: var theData = getAjaxData() sẽ được call như một hàm tầm thường, nó sẽ return bất cứ cái gì mà ta truyền vào:

var theData = getAjaxData('This is not ajax data');
alert(theData) // This is not ajax data

Còn thực sự biến data của hàm đó, chỉ mang dữ liệu ajax khi và chỉ khi hàm đó đóng vai trò là một callback của hàm $.ajax('some/web/address').done(callback) mà thôi. Đến đây, bạn có thể đoán ra hàm $.ajax('some/web/address').done(callback) được định nghĩa như thế nào rồi chứ?

$.ajax.done = function(callback){
    var data;
    // do some thing to get data
    data = 'Some ajax value';
    callback(data); // <---
}

Tóm lại, callback không dành cho bạn dùng, bạn truyền biến, mà dành cho một hàm khác. Vậy bạn có thắc mắc: Làm sao để tôi có thể lấy data ra ngoài? Câu trả lời đơn giản thôi: dùng biến data, và hãy viết code tiếp ở trong callback, đừng mơ tưởng đến bên ngoài nữa! Đây thực ra cũng thể hiện cách xử lý theo logic bạn ạ. Callback được thực hiện SAU KHI ajax thực hiện xong tác vụ của mình. Và chỉ tại thời điểm hàm callback được triệu gọi, biến data mới có ý nghĩa. Vì vậy bạn phải viết mã thành như sau:

$.ajax('some/web/address').done(function(data){
    alert('I know the data is: '+data);
    // do some other things with the data HERE!
});

Dùng callback một cách "vô trách nhiệm":

Đây gần như là một tiêu chuẩn viết callback hơn là lỗi do bạn sử dụng. Các ví dụ về cách dùng callback "vô trách nhiệm" mà mình sẽ viết dưới đây, về mặt kỹ thuật không sai nhưng nó mang lại nhiều khó khăn cho việc debug, cũng như khả năng scalable.

Bạn thấy bài viết này như thế nào?: 
No votes yet
Ảnh của Tommy Tran

Tommy owner Express Magazine

Drupal Developer having 9+ year experience, implementation and having strong knowledge of technical specifications, workflow development. Ability to perform effectively and efficiently in team and individually. Always enthusiastic and interseted to study new technologies

  • Skype ID: tthanhthuy

Tìm kiếm bất động sản

 

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 

Galaxy Nexus with Android 4.0 Ice Cream Sandwich

Today Google and Samsung announced the new smartphone Galaxy Nexus, Galaxy Nexus is the first LTE-enabled smartphone powered with Android 4.0 aka Ice Cream Sandwich.

Chiến lược Seo quyết định thứ hạng cao

Chiến lược Seo quyết định thứ hạng cao

Chúng ta đã biết 4 thành tố quan trọng nhất trong thứ hạng từ khóa đó là “Tứ trụ trong Seo” bao gồm điều hướng Onpage,

Dịch trực tiếp sang tiếng Anh bằng thanh địa chỉ và thanh tìm kiếm

Dịch trực tiếp sang tiếng Anh bằng thanh địa chỉ và thanh tìm kiếm

Dịch trực tiếp từ thanh địa chỉ của trình duyệt hoặc thanh tìm kiếm, bằng cách thêm vào một công cụ tìm kiếm (trong Chrome) hoặc một bookmark dẫn tới...

Công ty diệt chuột T&C

 

Diet con trung