37

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

在这个问题之后:https ://github.com/nodejs/node/issues/8382

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

我想使用这个片段

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])}`;
}

如何将此代码段添加到节点 repl 上的自定义 eval 中?

节点 repl 中的示例:

> const user = await User.findOne();
4

3 回答 3

77

节点 ^10开始,您可以在启动 repl 时使用以下标志:

node --experimental-repl-await
$ await myPromise()
于 2018-10-26T14:47:44.617 回答
8

有项目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 Devtools,开始时有点繁琐但 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://inspectChrome,您将能够连接到该node实例。Chrome Devtools 具有顶级等待、出色的选项卡补全功能等。

于 2018-03-17T19:06:58.417 回答
2

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

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

于 2017-01-06T09:42:14.723 回答