打字稿:需要在从异步函数读取的全局范围内声明一个常量

Joz*_*zef 1 javascript scope asynchronous constants typescript

这里有一个新手问题。我需要在我的 Typescript 文件的顶层声明 const,所以它可以被下面的所有函数访问。问题是我需要分配给这个常量的值被异步函数返回,这就是我卡住的地方。不能从顶层调用异步函数——我可以做这样的事情,但在这种情况下,常量不再在顶层,其他函数无法访问。

(async () => {
    const myConst = await asyncFunction(params);
})(); 
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用 let 而不是 const,就像这样,但我宁愿在那里使用 const

let myConst;
(async () => {
    myConst = await asyncFunction(params);
})();
Run Code Online (Sandbox Code Playgroud)

你能给我建议吗?有没有办法摆脱它,以便我可以为全局范围声明 const 并根据异步函数为其分配一个值?

非常感谢 :)

Jes*_*ett 5

在顶级变量中使用异步结果是有问题的,因为当模块中的函数尝试读取值时,无法保证结果准备就绪。在我看来,正确且安全的方法是为顶级变量分配一个承诺,并使任何读取该值await的函数成为结果:

const myConst = asyncFunction(params);

async function example() {
  doStuff(await myConst);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果将异步结果放在顶级变量中很重要,并且您有某种方法可以保证该值在读取之前准备好,那么我会接受您的let分配。const在这种情况下,我认为没有什么好方法可以使变量 a 。

  • 现在是 2022 年,我很高兴[报告所有主要浏览器现在都支持“顶级 `await`”](https://caniuse.com/?search=top%20level%20await)([在模块中,至少](https://tc39.es/proposal-top-level-await/))因此现在可以安全地在根/全局范围中使用`const myConst = wait asyncFunction(params);`(同样,仅在模块脚本文件)。 (2认同)