gpt4 book ai didi

node.js - 如果当前运行时支持,则使用顶级等待

转载 作者:行者123 更新时间:2023-12-03 12:17:46 24 4
gpt4 key购买 nike

在 14.3.0 中通过 --experimental-top-level-await 添加了对 Node.js 的顶级 await 支持后来到 --harmony-top-level-await .
问题
如果当前 Node.js 运行时支持,我需要在我的 ESM 脚本文件中使用顶级 await。此外,我需要设置一个 bool 标志来指示在顶层成功等待 promise 。
我的意思的一个例子:

let topLevelAwaitEnabled;
try {
await Promise.resolve(); // replaced with an actual promise
topLevelAwaitEnabled = true;
} catch (ignored) {
topLevelAwaitEnabled = false;
}
console.log(topLevelAwaitEnabled);

// carry on with the rest of the application, regardless of success or failure
// at some point, topLevelAwaitEnabled is checked to conditionally execute some code
如果启用了顶级 await 支持,这会成功。但是,如果不支持,这会导致解析时出现如下错误,运行时无法用 try捕获/ catch :
$ node test.js...\test.js:3
await Promise.resolve(); // replaced with an actual promise
^^^^^

SyntaxError: await is only valid in async function
所以问题是:如果受支持,我如何使用顶级 await,而不会与不支持顶级 await 的 Node.js 运行时产生不兼容问题(没有指定 CLI 标志或根本没有运行时支持)?
如果答案是“不可能”,我想解释一下为什么这是不可能的。

在这种情况下,我实际上是在提交 XY problem ,根本问题是我需要顶级动态导入。

Note: I am well aware that top level await is not recommended for a variety of reasons, however it is crucial for a specific functionality of my application and does not impose any issue with my use case. Alternatives will likely not suffice.


尝试
我尝试了以下方法,无济于事:
  • eval :我尝试用 eval("await Promise.resolve()") 替换 await 行,希望在当前上下文中评估代码。不幸的是,即使支持顶级 await,这也会导致相同的错误,因为它似乎没有继承当前上下文。
  • vm.compileFunction : 同样的问题是 eval() , 不支持顶级 await 。
  • vm.SourceTextModule :评估是异步的,需要在顶层等待以检查它是否受支持...这是一个捕获 22。
  • await 的条件执行基于 process.versionprocess.execArgv :解析过程中的错误 - 它从未真正执行代码,因此排除了条件执行。
  • 最佳答案

    据我所知这是不可能的,因为解析器只会出错。编译器不会理解 await指令并且不会完成其循环。这可能类似于使用一个根本不是公认关键字的词。
    最接近的是使用匿名函数。

    关于node.js - 如果当前运行时支持,则使用顶级等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64670514/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com