我对异步函数的理解是错误的吗?为什么我会出现以下行为?

问题描述 投票:0回答:1

我查看了其他一些帖子,但没有一个真正回答了我的问题,而且 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>

},但它没有改变任何事情。

知道我为什么会出现这种行为吗?

谢谢你。
javascript asynchronous async-await
1个回答
0
投票

函数在两种情况下被视为异步:
  1. 回报承诺
  2. async
  3. 声明(这使得它返回一个解析为返回值的承诺)

await
 没有必要。它只允许等待函数内的承诺得到解决,并推迟其后代码的执行。也适用于 ES 模块的顶层。

当你将

async

 应用于非承诺时,Typescript 可能会告诉你这没有效果 - 因为没有承诺等待。但事实并非如此,
await
将下一个代码推迟到 JS 微任务中,并且它是异步执行的。正如您所看到的,推迟 
await
 后的所有内容,甚至在 
await
 之后使用非承诺值:

await

没有

(async () => { await queueMicrotask(() => console.log('before await')); console.log('after await') })();

await

© www.soinside.com 2019 - 2024. All rights reserved.