What is `async*`?



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*是如何做到这一点的。异步迭代器和为什么你想要一个异步生成器是完全不同的蜡球。

最新更新