2012-09-16 34 views
5

Im đọc bài viết này: http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/ và gặp một số vấn đề nhỏ trong việc hiểu luồng.nodejs stream vs callbacks

Trích:

"Suppose we want to develop a simple web application 
that reads a particular file from disk and send it to the browser. 
The following code shows a very simple and naïve implementation 
in order to make this happen." 

Vì vậy, các mẫu mã được như sau:

var readStream = fileSystem.createReadStream(filePath); 
readStream.on('data', function(data) { 
    response.write(data); 
}); 

readStream.on('end', function() { 
    response.end();   
}); 

Tại sao chúng ta sẽ sử dụng cách trên khi chúng ta chỉ có thể làm:

fs.readFile(filePath, function(err, data){ 
    response.write(data); 
    response.end(); 
}); 

Khi nào hoặc tại sao tôi nên sử dụng luồng?

Trả lời

13

Bạn muốn sử dụng luồng khi làm việc với các tệp lớn. Với một cuộc gọi lại, tất cả các nội dung của tập tin phải được nạp vào bộ nhớ cùng một lúc, trong khi với một dòng, chỉ một đoạn của tập tin là trong bộ nhớ tại bất kỳ thời điểm nào.

Ngoài ra, giao diện luồng được cho là thanh lịch hơn. Thay vì gắn một cách rõ ràng data, drain, và end callbacks, bạn có thể sử dụng thay vì pipe:

var readStream = fileSystem.createReadStream(filePath); 
readStream.pipe(response); 
5

Một lý do lớn là bạn có thể bắt đầu làm việc trên các dữ liệu trước đó là tất cả trong bộ nhớ. Hãy nghĩ "phát trực tuyến video", nơi bạn có thể bắt đầu xem clip trong khi vẫn đang tải. Trong nhiều trường hợp sử dụng, luồng sẽ cho phép bạn bắt đầu xử lý dữ liệu từ một tệp trước khi bạn tải toàn bộ nội dung.

Trường hợp sử dụng phổ biến khác là khi bạn chỉ muốn đọc một đối tượng cho đến khi bạn phát hiện một số điều kiện trong dữ liệu. Giả sử bạn cần kiểm tra xem tệp lớn có chứa từ "thỏ" hay không. Nếu bạn sử dụng mẫu gọi lại, bạn sẽ cần phải đọc toàn bộ tệp vào bộ nhớ, sau đó đi qua tệp và kiểm tra xem liệu từ đó có nằm trong đó hay không. Với một luồng, bạn có thể phát hiện từ trên dòng 5 của tệp, sau đó bạn có thể đóng luồng mà không tải toàn bộ nội dung. Rõ ràng là có nhiều trường hợp sử dụng phức tạp hơn, và vẫn còn rất nhiều lần khi gọi lại vẫn có ý nghĩa hơn cho sự đơn giản (như nếu bạn cần đếm tổng số lần "thỏ" xuất hiện, trong trường hợp này bạn có để tải toàn bộ tệp).