带有异步等待的节点 repl

Posted

技术标签:

【中文标题】带有异步等待的节点 repl【英文标题】:Node repl with async await 【发布时间】:2017-05-19 23:53:40 【问题描述】:

我想添加对 async/await 到节点 repl 的支持

关注这个问题:https://github.com/nodejs/node/issues/8382

我尝试使用这个https://github.com/paulserraino/babel-repl,但它缺少异步等待支持

我想用这个sn-p

const awaitMatcher = /^(?:\s*(?:(?:let|var|const)\s)?\s*([^=]+)=\s*|^\s*)(await\s[\s\S]*)/;
const asyncWrapper = (code, binder) => 
  let assign = binder ? `root.$binder = ` : '';
  return `(function() async function _wrap()  return $assign$code  return _wrap();)()`;
;

// match & transform
const match = input.match(awaitMatcher);
if(match) 
  input = `$asyncWrapper(match[2], match[1])`;

如何将此 sn-p 添加到节点 repl 上的自定义 eval 中?

节点repl中的示例:

> const user = await User.findOne();

【问题讨论】:

使用普通的 Node 7 REPL 和--harmony 怎么样? node --harmony-async-await 在 Node 7 REPL 上不起作用 嗯,应该的。我建议检查节点版本。显然,await 应该在 async 函数内部。 你是问怎么写补丁解决github.com/nodejs/node/issues/13209? 另见***.com/questions/44169542/… 【参考方案1】:

截至node ^10,您可以在启动repl 时使用以下标志:

node --experimental-repl-await
$ await myPromise()

【讨论】:

在节点 10 和 12 中工作得很好,并且可以在 bashrc/zshrc 中使用export NODE_OPTIONS="--experimental-repl-await" 进行设置(因此您在调试时始终拥有它)。 从节点 v16.6.0(2021 年 7 月 29 日。changelog & commit a082a705b)开始,repl 中的 async-await 默认启用。您可以通过 --no-experimental-repl-await 选择退出。【参考方案2】:

有项目https://github.com/ef4/async-repl:

$ async-repl
async> 1 + 2
3
async> 1 + await new Promise(r => setTimeout(() => r(2), 1000))
3
async> let x = 1 + await new Promise(r => setTimeout(() => r(2), 1000))
undefined
async> x
3
async>

另一种选择是使用 Chrome 开发工具,开始时有点繁琐但 UI 很棒:

$ node --inspect -r esm
Debugger listening on ws://127.0.0.1:9229/b4fb341e-da9d-4276-986a-46bb81bdd989
For help see https://nodejs.org/en/docs/inspector
> Debugger attached.

(我在这里使用esm 包来允许Node 解析import 语句。)

然后您在 Chrome 中转到 chrome://inspect,您将能够连接到 node 实例。 Chrome Devtools 具有***等待、出色的 tab-completion 等功能。

【讨论】:

可以看演示吗?【参考方案3】:

这个想法是预处理命令并将其包装在异步函数中,如果 在 async 函数之外有一个 await 语法

这个https://gist.github.com/princejwesley/a66d514d86ea174270210561c44b71ba是最终解决方案

【讨论】:

我们应该期待承诺还是结果? REPL 不会挂起,直到它得到你需要以某种方式暂停和恢复它的结果,但是 afaik。不支持,至少我退出了repl.pause()。这里的另一个问题:github.com/nodejs/node/issues/13209

以上是关于带有异步等待的节点 repl的主要内容,如果未能解决你的问题,请参考以下文章

节点在继续之前等待异步功能

通过节点的异步/等待不需要按预期顺序返回结果 - 使用啥正确模式?

定义异步函数时的异步/等待节点 v9“意外令牌函数”

如何使节点 fs 与类异步/等待?

ForEach 循环中的异步/等待节点 Postgres 查询

如何在节点 js 中正确使用等待/异步与 for 循环