我查看了其他一些帖子,但没有一个真正回答了我的问题,而且 chatGPT 也不是很有帮助......
考虑以下 Javascript(而不是 Typescript!)代码:
exports.getValue = async (param1) => {
const snapshot = await someFunction1(); //someFunction1 definitely returns a Promise, it's from a known API
return snapshot.get("received"); //get returns any (so it could be undefined)
};
此时,我的函数 1) 被定义为
async
2) 内部有一个 await
调用 3) 当我将鼠标悬停在其上时,有以下信息:(property) alreadyReceived: (param1: any) => Promise<any>
。
现在在其他文件中的异步函数中,我想调用此函数。所以,很自然地,我写了
const booleanValueINeed = await getValue(myArg);
但是在这里,我从 VS Code 收到以下警告
'await' has no effect on the type of this expression. ts(80007)
。在我看来,await
是有道理的。
请注意,这是一个 TypeScript 警告,即使我位于
.js
文件中。奇怪的是,我一直在编写大量异步代码,但每当确实没有必要时,我都没有收到警告。
正如另一篇文章中所建议的,我还尝试添加 JSDOC (
/* returns {Promise<boolean>
},但它没有改变任何事情。知道我为什么会出现这种行为吗?
谢谢你。
函数在两种情况下被视为异步:
用
async
await
没有必要。它只允许等待函数内的承诺得到解决,并推迟其后代码的执行。也适用于 ES 模块的顶层。当你将
async
应用于非承诺时,Typescript 可能会告诉你这没有效果 - 因为没有承诺等待。但事实并非如此,
await
将下一个代码推迟到 JS 微任务中,并且它是异步执行的。正如您所看到的,推迟
await
后的所有内容,甚至在
await
之后使用非承诺值:
await
没有
(async () => {
await queueMicrotask(() => console.log('before await'));
console.log('after await')
})();
:
await