Ответ узла с помощью async await

Я хотел бы добавить поддержку async / await для node repl

После этой проблемы: https://github.com/nodejs/node/issues/8382

Я пробовал использовать этот https://github.com/paulserraino/babel-repl но отсутствует поддержка async await

Я хотел бы использовать этот фрагмент

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

Как я могу добавить этот фрагмент в пользовательский eval на node repl?

Пример в реплике узла:

> const user = await User.findOne();

person Sibelius Seraphini    schedule 05.01.2017    source источник
comment
А как насчет использования обычного REPL узла 7 с --harmony?   -  person Estus Flask    schedule 05.01.2017
comment
node --harmony-async-await на узле 7 REPL не работают   -  person Sibelius Seraphini    schedule 05.01.2017
comment
Что ж, должно быть. Я бы посоветовал проверить версию узла. Очевидно, await должен находиться внутри async функции.   -  person Estus Flask    schedule 05.01.2017
comment
Вы спрашиваете, как написать патч, решающий проблему github.com/nodejs/node/issues/13209 < / а>?   -  person Bergi    schedule 05.09.2017
comment
См. Также stackoverflow.com/questions/44169542/   -  person Bergi    schedule 05.09.2017


Ответы (3)


Начиная с node ^ 10, вы можете использовать следующий флаг при запуске ответ:

node --experimental-repl-await
$ await myPromise()
person Paul Razvan Berg    schedule 26.10.2018
comment
Отлично работает в узлах 10 и 12 и может быть установлен в bashrc / zshrc с помощью export NODE_OPTIONS="--experimental-repl-await" (так что он всегда есть при отладке). - person Elliot Nelson; 10.06.2020

Есть проект 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:

$ 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://inspect в Chrome и сможете подключиться к экземпляру node. Chrome Devtools имеет ожидание верхнего уровня, отличное завершение вкладок и т. Д.

person w00t    schedule 17.03.2018
comment
можно посмотреть демку ?. - person Yoarthur; 07.12.2018