2012-04-07 37 views
8

Các documentation for write() nói:Node.js' và sự kiện cống

Returns sai để cho biết rằng bộ đệm hạt nhân là đầy đủ, và các dữ liệu sẽ được gửi đi trong tương lai.

và tài liệu hướng dẫn cho sự kiện drain nói:

Sau một phương pháp write() trở sai sự thật, sự kiện này được phát ra để cho biết rằng nó là an toàn để viết một lần nữa.

Điều đó có nghĩa là gì? Tôi có phải đợi sự kiện drain trước khi tôi có thể viết lại không? Điều gì đã xảy ra với dữ liệu mà tôi đã cố gắng viết? Điều đó có bị mất không? Điều gì sẽ xảy ra khi tôi gọi viết mà không cần đợi sự kiện drain?

Trả lời

6

Bạn có thể gọi write() mà không cần quan tâm đến giá trị trả lại một cách an toàn. Nút sẽ đệm bất kỳ cuộc gọi ghi nào trong khi bộ đệm hạt nhân đầy, và đẩy chúng theo thứ tự như bạn mong đợi. Bạn không cần phải chờ sự kiện 'drain' trước khi viết lại.

Tùy chọn, bạn có thể kiểm tra giá trị trả về của write() và sau đó thông báo cho điều đang ghi vào Luồng mà bộ đệm đầy. Đây chính xác là những gì Stream#pipe() does.

Vì vậy, thông thường, chỉ cần sử dụng Stream#pipe() và tất cả các goodies được đưa về chăm sóc cho bạn :)

+1

gì sẽ xảy ra nếu bạn gọi 'process.exit() 'trong khi' res.write' vẫn đệm trong bộ nhớ sử dụng (tức là không được flushed đến bộ đệm hạt nhân)? Câu trả lời có bị mất không? – Emmett

+0

@Emmett vâng, nếu bạn gọi 'process.exit()' trong khi có đệm ghi cuộc gọi còn lại để được flushed thì dữ liệu đó sẽ bị mất. – TooTallNate

+1

Không hoàn toàn an toàn để gọi "write"() mà không quan tâm đến giá trị trả lại ". [Tài liệu hiện tại] (https://nodejs.org/dist/v8.4.0/docs/api/stream.html) nói: _ "Trong khi gọi' write() 'trên luồng không được thoát, Node Ngay cả trước khi nó hủy bỏ, sử dụng bộ nhớ cao sẽ gây ra hiệu suất thu gom rác kém và RSS cao (mà thường không được phát hành trở lại hệ thống, thậm chí sau khi bộ nhớ không còn cần thiết nữa. "_ Cũng thấy: https://stackoverflow.com/q/37579605 – TachyonVortex

Các vấn đề liên quan