***等待在最新的 Node.js 中不起作用

Posted

技术标签:

【中文标题】***等待在最新的 Node.js 中不起作用【英文标题】:Top-level await doesn't work in the latest Node.js 【发布时间】:2020-04-22 10:39:12 【问题描述】:

Node.js(2020 年 1 月,Node.js 13.5.0)仍然不支持*** await

我尝试了一些教程,例如this one,但仍然没有运气,总是遇到同样的错误:

D:\NodeJS>node --experimental-modules test.js
(node:17724) ExperimentalWarning: The ESM module loader is experimental.
file:///D:/NodeJS/test.js:9
await test();
^^^^^

SyntaxError: Unexpected reserved word

整个文件内容:

function test() 


await test();

我尝试在package.json 中使用"type": "module",并将文件重命名为test.mjs,但仍然出现同样的错误,即使使用最新的Node.js 13.5.0

我做错了什么?

【问题讨论】:

*** await 仍然是第 3 阶段的提案,是什么让您认为它是 node 中的实验性功能? 你指的文章只讲ES模块,不讲***await 那篇文章描述了启用 ES 模块,这在规范中已经有一段时间了,而不是*** await 仍然是一个提议 @Klaycon 正如我解释的那样,我确实尝试将文件重命名为*.mjs,并将type 设置为module,但没有任何效果。这些东西应该把脚本变成 ES 模块。 那为什么你的问题是关于***等待?我认为您混淆了 2 个不同的主题。 【参考方案1】:

node --experimental-repl-await 适用于节点 REPL

编辑:Node 16 REPL 默认接受***等待,您不再需要实验标志

【讨论】:

另外,如果你总是想在不明确传递标志的情况下启用它,你可以在你的.bashrcexport NODE_OPTIONS='--experimental-repl-await'【参考方案2】:

使用node -e时:

请注意,虽然***await 在节点14.8.0 中未标记,但在执行node -e (node --eval) 时,输入类型默认为CJS,而***await 仅在ESM 中允许模式。

要告诉输入是 ESM,你需要一个标志:

node --input-type=module -e 'console.log(await Promise.resolve(42))'
> 42

【讨论】:

【参考方案3】:

我不知道为什么,但要获得像你这样的 --harmony 功能需要使用 --eval (-e) 或 --print (-p) 而不是像启动节点一样 node -e "import('./test.mjs')" --experimental-modules --input-type=module --harmony-top-level-await

文件内容:

console.log(await Promise.resolve("test"));

控制台:

node -e "import('./test.mjs')" --experimental-modules --input-type=module --harmony-top-level-await
(node:9096) ExperimentalWarning: The ESM module loader is experimental.
test

【讨论】:

node 14.8.0开始,您现在只需要--input-type=module;其他两个默认启用。【参考方案4】:

根据 this issue tracker 和 this blog post,*** await 在标志 --harmony-top-level-await 后面的 Node v13.3+ 中可用。您启用的模块标志仅适用于 ESM 模块,不适用于***等待。

【讨论】:

几乎可以。 So that article is incorrect then?因为它不起作用,除非我使用mjs文件扩展名,或者在package.json中设置"type": "module" @vitaly-t 文章和规范确实声明*** await 只能在 ESM 模块中工作,而不能在 commonjs 模块中工作,因此您必须使用 mjs 扩展或"type": "module" 无论如何。文章应该提到该功能仅在该标志后面的 V8 中,但没有。它只是说它在节点中可用之前“需要一些时间”。 另外,当用 --harmony 替换那个标志时,没有任何效果。 啊,那我错了。我在其他地方读到--harmony 启用所有和谐标志。我已经编辑了答案。 我使用的是 Node v14.7.0,我在 node --help 中找不到任何 --harmony 标志,但有一个 --experimental-repl-await 标志对我有用。

以上是关于***等待在最新的 Node.js 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mysql-event 在 node.js 中不起作用?

下一个(错误)在 node.js 中不起作用

Angular js 表达式在 Node js 项目中不起作用

Node 命令似乎在 Windows 中不起作用

Selenium 显式等待在新的 safariDriver 2.48.0 中不起作用

等待 asyncio.sleep(1) 在 python 中不起作用