typescript - 我为什么要施放 Promise承诺?
问题描述
我写了一个返回 Promise 的异步生成器。
function convert(): Promise<void> { return null; }
async function* conversions(): AsyncIterableIterator<Promise<void>> {
await convert();
yield convert(); // error TS2322: Type 'void' is not assignable to type 'Promise<void>'.
yield convert() as Promise<any>;
}
我认为应该没有错误。为什么会出现 TS2322?
解决方案
AsyncIterableIterator
的泛型参数不代表promise,而是代表内部值,可以通过await
ing这个迭代器来获取。所以,这段代码有效:
function convert(): Promise<void> { return Promise.resolve(); }
async function* conversions(): AsyncIterableIterator<void> {
await convert();
yield convert();
}
旁注:如您所见,您的convert
函数变体未编译,因此我对其进行了一些更改以消除错误。
为了了解这一切是如何工作的,让我们为迭代器添加一些有意义的返回类型。像这样的东西:
async function convert(): Promise<number> { return 0; }
async function* conversions(): AsyncIterableIterator<number> {
await convert();
yield convert();
}
async () => {
const num: number = (await conversions().next()).value;
}
const num: Promise<number> = conversions().next().then((ret) => ret.value);
您可以看到await
ing 您的迭代器返回其中指定的类型,而简单地调用next
将返回应遵循的承诺then
以检索值(实际上,再次是值的承诺)。
推荐阅读
- java - spring.datasource.url 未找到
- python-3.x - 我使用 python 制作了一个 wordcloud,我想查看 wordcloud 中的单词,如有必要,将它们从图像中删除
- crystal-reports - Crystal Reports - 获取已故记录和在世记录配偶的信息
- excel - 获取二维数组中特定列的最大值
- python - 无法连接到 Oracle 本地数据库 - cx_Oracle.DatabaseError: ORA-12541: TNS:no listener
- database - 如何将 Amazon ORACLE AWS RDS 中 TEMP TABLESPACE 的表 DBA_TEMP_FILES 中的 AUTOEXTENSIBLE 列更改为 YES?
- java - Spring 5 Oauth2 - 如何在我的资源服务器中提供检查令牌 URL?
- css-selectors - 如何在 WebDriverIO 中使用自定义类名
- javascript - FullCalendar - 显示过去的日期
- api - Sonos API 作为回报发送的验证码太短?