带有异步等待的节点 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的主要内容,如果未能解决你的问题,请参考以下文章
通过节点的异步/等待不需要按预期顺序返回结果 - 使用啥正确模式?