AsyncGenerator

Baseline Widely available

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

Đối tượng AsyncGenerator được trả về bởi hàm generator bất đồng bộ và nó tuân theo cả giao thức async iterable và giao thức async iterator.

Các phương thức của async generator luôn tạo ra các đối tượng Promise.

AsyncGenerator là lớp con của lớp ẩn AsyncIterator.

Constructor

Không có thực thể JavaScript nào tương ứng với constructor AsyncGenerator. Các instance của AsyncGenerator phải được trả về từ hàm generator bất đồng bộ:

js
async function* createAsyncGenerator() {
  yield Promise.resolve(1);
  yield await Promise.resolve(2);
  yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3

Chỉ có một đối tượng ẩn là đối tượng prototype được chia sẻ bởi tất cả các đối tượng được tạo bởi hàm generator bất đồng bộ. Đối tượng này thường được ký hiệu là AsyncGenerator.prototype để trông giống lớp, nhưng nên được gọi chính xác hơn là AsyncGeneratorFunction.prototype.prototype, vì AsyncGeneratorFunction là một thực thể JavaScript thực sự. Để hiểu chuỗi prototype của các instance AsyncGenerator, xem AsyncGeneratorFunction.prototype.prototype.

Thuộc tính instance

Các thuộc tính này được định nghĩa trên AsyncGenerator.prototype và được chia sẻ bởi tất cả các instance AsyncGenerator.

AsyncGenerator.prototype.constructor

Hàm constructor đã tạo đối tượng instance. Đối với các instance AsyncGenerator, giá trị khởi tạo là AsyncGeneratorFunction.prototype.

Note: Các đối tượng AsyncGenerator không lưu trữ tham chiếu đến hàm generator bất đồng bộ đã tạo ra chúng.

AsyncGenerator.prototype[Symbol.toStringTag]

Giá trị khởi tạo của thuộc tính [Symbol.toStringTag] là chuỗi "AsyncGenerator". Thuộc tính này được dùng trong Object.prototype.toString().

Phương thức instance

Cũng kế thừa các phương thức instance từ lớp cha AsyncIterator.

AsyncGenerator.prototype.next()

Trả về Promise sẽ được giải quyết với giá trị đã cho được tạo ra bởi biểu thức yield.

AsyncGenerator.prototype.return()

Hoạt động như thể câu lệnh return được chèn vào thân generator tại vị trí đang tạm dừng hiện tại, kết thúc generator và cho phép generator thực hiện các tác vụ dọn dẹp khi kết hợp với khối try...finally.

AsyncGenerator.prototype.throw()

Hoạt động như thể câu lệnh throw được chèn vào thân generator tại vị trí đang tạm dừng hiện tại, thông báo cho generator về điều kiện lỗi và cho phép nó xử lý lỗi, hoặc thực hiện dọn dẹp và tự đóng lại.

Ví dụ

Lặp async generator

Ví dụ sau đây lặp trên async generator, ghi các giá trị 1–6 ra console tại các khoảng thời gian giảm dần. Lưu ý rằng mỗi lần một Promise được tạo ra, nhưng nó được giải quyết tự động trong vòng lặp for await...of.

js
// An async task. Pretend it's doing something more useful
// in practice.
function delayedValue(time, value) {
  return new Promise((resolve /*, reject */) => {
    setTimeout(() => resolve(value), time);
  });
}

async function* generate() {
  yield delayedValue(2000, 1);
  yield delayedValue(1000, 2);
  yield delayedValue(500, 3);
  yield delayedValue(250, 4);
  yield delayedValue(125, 5);
  yield delayedValue(50, 6);
  console.log("All done!");
}

async function main() {
  for await (const value of generate()) {
    console.log("value", value);
  }
}

main().catch((e) => console.error(e));

Đặc tả kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-asyncgenerator-objects

Tương thích trình duyệt

Xem thêm