Streams API

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2019.

* Some parts of this feature may have varying levels of support.

Note: This feature is available in Web Workers.

API luồng cho phép JavaScript truy cập theo chương trình các luồng dữ liệu nhận được qua mạng và xử lý chúng theo mong muốn của nhà phát triển.

Khái niệm và cách sử dụng

Truyền phát liên quan đến việc chia tài nguyên mà bạn muốn nhận qua mạng thành các phần nhỏ, sau đó xử lý tài nguyên đó từng chút một. Các trình duyệt đã thực hiện điều này khi nhận nội dung phương tiện - video sẽ đệm và phát khi có nhiều nội dung tải xuống hơn và đôi khi bạn sẽ thấy hình ảnh hiển thị dần dần khi có nhiều nội dung được tải hơn.

Nhưng khả năng này chưa bao giờ có sẵn cho JavaScript trước đây. Trước đây, nếu chúng tôi muốn xử lý một loại tài nguyên nào đó (video, tệp văn bản, v.v.), chúng tôi phải tải xuống toàn bộ tệp, đợi cho đến khi nó được giải tuần tự hóa thành định dạng phù hợp, sau đó xử lý tất cả dữ liệu.

Với API Luồng, bạn có thể bắt đầu xử lý dữ liệu thô bằng JavaScript từng chút một, ngay khi có sẵn mà không cần tạo bộ đệm, chuỗi hoặc blob.

Khái niệm cơ bản của API luồng là dữ liệu được tìm nạp từ mạng trong một số gói dữ liệu. Dữ liệu được xử lý rồi gửi tới trình duyệt dưới dạng luồng gói dữ liệu.

Ngoài ra còn có nhiều ưu điểm hơn — bạn có thể phát hiện thời điểm bắt đầu hoặc kết thúc luồng, xâu chuỗi các luồng lại với nhau, xử lý lỗi và hủy luồng theo yêu cầu cũng như phản ứng với tốc độ đọc luồng.

Việc sử dụng Luồng phụ thuộc vào việc cung cấp phản hồi dưới dạng luồng. Ví dụ: nội dung phản hồi được trả về bởi yêu cầu tìm nạp thành công là ReadableStream mà trình đọc được tạo bằng ReadableStream.getReader() có thể đọc được.

Các cách sử dụng phức tạp hơn bao gồm việc tạo luồng của riêng bạn bằng cách sử dụng hàm tạo ReadableStream(), chẳng hạn như để xử lý dữ liệu bên trong nhân viên dịch vụ.

Bạn cũng có thể ghi dữ liệu vào luồng bằng WritableStream.

[!LƯU Ý] Bạn có thể tìm thấy nhiều thông tin chi tiết hơn về lý thuyết và thực tiễn về luồng trong các bài viết của chúng tôi — Khái niệm API luồng, Sử dụng luồng có thể đọc được, Sử dụng luồng byte có thể đọc đượcSử dụng luồng có thể ghi.

Giao diện luồng

Luồng có thể đọc được

ReadableStream

Biểu thị luồng dữ liệu có thể đọc được. Nó có thể được sử dụng để xử lý các luồng phản hồi của API tìm nạp hoặc các luồng do nhà phát triển xác định (ví dụ: hàm tạo ReadableStream() tùy chỉnh).

ReadableStreamDefaultReader

Đại diện cho một trình đọc mặc định có thể được sử dụng để đọc dữ liệu luồng được cung cấp từ mạng (ví dụ: yêu cầu tìm nạp).

ReadableStreamDefaultController

Đại diện cho bộ điều khiển cho phép kiểm soát trạng thái và hàng đợi nội bộ của ReadableStream. Bộ điều khiển mặc định dành cho các luồng không phải là luồng byte.

Luồng có thể ghi

WritableStream

Cung cấp một bản tóm tắt tiêu chuẩn để ghi dữ liệu truyền phát đến đích, được gọi là phần chìm. Đối tượng này đi kèm với áp suất ngược và xếp hàng tích hợp.

WritableStreamDefaultWriter

Đại diện cho trình ghi luồng có thể ghi mặc định có thể được sử dụng để ghi các khối dữ liệu vào luồng có thể ghi.

WritableStreamDefaultController

Đại diện cho bộ điều khiển cho phép kiểm soát trạng thái của WritableStream. Khi xây dựng WritableStream, phần chìm bên dưới được cung cấp một phiên bản WritableStreamDefaultController tương ứng để thao tác.

Chuyển đổi luồng

TransformStream

Thể hiện sự trừu tượng hóa cho một đối tượng luồng biến đổi dữ liệu khi nó đi qua chuỗi ống của các đối tượng luồng.

TransformStreamDefaultController

Cung cấp các phương thức để thao tác ReadableStreamWritableStream được liên kết với luồng biến đổi.

API và hoạt động của luồng liên quan

ByteLengthQueuingStrategy

Cung cấp chiến lược xếp hàng có độ dài byte tích hợp có thể được sử dụng khi xây dựng luồng.

CountQueuingStrategy

Cung cấp chiến lược xếp hàng đếm đoạn tích hợp có thể được sử dụng khi xây dựng luồng.

Tiện ích mở rộng cho các API khác

Request

Khi một đối tượng Request mới được tạo, bạn có thể chuyển cho nó ReadableStream trong thuộc tính body của từ điển RequestInit của nó. Request này sau đó có thể được chuyển đến fetch() để bắt đầu tìm nạp luồng.

Response.body

Nội dung phản hồi được trả về bởi yêu cầu tìm nạp theo mặc định được hiển thị dưới dạng ReadableStream và có thể có trình đọc được đính kèm với nó, v.v.

Các giao diện liên quan đến ByteStream

ReadableStreamBYOBReader

Đại diện cho trình đọc BYOB ("mang bộ đệm của riêng bạn") có thể được sử dụng để đọc dữ liệu luồng do nhà phát triển cung cấp (ví dụ: hàm tạo ReadableStream() tùy chỉnh).

ReadableByteStreamController

Đại diện cho bộ điều khiển cho phép kiểm soát trạng thái và hàng đợi nội bộ của ReadableStream. Bộ điều khiển luồng byte dành cho luồng byte.

ReadableStreamBYOBRequest

Thể hiện yêu cầu kéo vào trong ReadableByteStreamController.

Ví dụ

Chúng tôi đã tạo một thư mục gồm các ví dụ đi kèm với tài liệu API Streams — xem mdn/dom-examples/streams. Các ví dụ như sau:

  • Bơm luồng đơn giản: Ví dụ này cho thấy cách sử dụng ReadableStream và truyền dữ liệu của nó sang một luồng khác.
  • Thang độ xám a PNG: Ví dụ này cho thấy cách ReadableStream của PNG có thể được chuyển thành thang độ xám.
  • Luồng ngẫu nhiên đơn giản: Ví dụ này cho thấy cách sử dụng luồng tùy chỉnh để tạo các chuỗi ngẫu nhiên, xếp chúng vào hàng đợi dưới dạng các đoạn rồi đọc lại.
  • Ví dụ về phát bóng đơn giản: Ví dụ này mở rộng ví dụ về luồng ngẫu nhiên đơn giản, cho thấy cách một luồng có thể được phát bóng và cả hai luồng kết quả đều có thể được đọc độc lập.
  • Nhà văn đơn giản: Ví dụ này cho thấy cách ghi vào luồng có thể ghi, sau đó giải mã luồng và ghi nội dung vào giao diện người dùng.
  • Giải nén các đoạn của PNG: Ví dụ này cho thấy cách pipeThrough() có thể được sử dụng để chuyển đổi ReadableStream thành luồng gồm các loại dữ liệu khác bằng cách chuyển đổi dữ liệu của tệp PNG thành luồng các đoạn PNG.

Thông số kỹ thuật

Specification
Streams
# rs-class
Streams
# ws-class

Khả năng tương thích của trình duyệt

api.ReadableStream

api.WritableStream

Xem thêm