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ộ:
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
AsyncGeneratorkhô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 trongObject.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ề
Promisesẽ được giải quyết với giá trị đã cho được tạo ra bởi biểu thứcyield. 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ốitry...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.
// 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> |