MDN上的这个例子解释了Symbol.asyncIterator
。
const myAsyncIterable = {
async* [Symbol.asyncIterator]() {
yield "hello";
yield "async";
yield "iteration!";
}
};
(async () => {
for await (const x of myAsyncIterable) {
console.log(x);
// expected output:
// "hello"
// "async"
// "iteration!"
}
})();
我的问题是async*
在代码中是什么意思?
给出的示例使用简写在对象文字或类中创建方法。考虑以下对象定义:
const iHaveAMethod = {
myMethod() {
return "cool!";
}
};
console.log(iHaveAMethod.myMethod()); // cool!
它还使用括号语法来定义使用符号的方法。
const iAmASymbol = Symbol("neat");
const iHaveAMethod = {
[iAmASymbol]() {
return "cool!";
}
};
console.log(iHaveAMethod[iAmASymbol]()); // cool!
它在作为生成器的对象上创建一个方法(使用*
语法)。
const iHaveAMethod = {
* myMethod() {
yield "cool!";
}
};
console.log(iHaveAMethod.myMethod().next().value); // cool!
最后,它是一个异步方法,因此用async
标记。
const iHaveAMethod = {
async* myMethod() {
yield Promise.resolve("cool!");
}
};
iHaveAMethod.myMethod().next().then(val => console.log(val.value)); // cool!
将其与括号语法相结合,就可以得到async*
:
const iAmASymbol = Symbol("neat");
const iHaveAMethod = {
async* [iAmASymbol]() {
yield Promise.resolve("cool!");
}
};
iHaveAMethod[iAmASymbol]().next().then(val => console.log(val.value)); // cool!
这就解释了async*
是如何做到这一点的。异步迭代器和为什么你想要一个异步生成器是完全不同的蜡球。