Cucumber-js: Замените process.exit () на process.exitCode

Созданный на 3 авг. 2017  ·  6Комментарии  ·  Источник: cucumber/cucumber-js

Можно ли заменить вызовы process.exit () (пара в run.js - это все, что я смог найти) на process.exitCode в соответствии с рекомендацией Node.js, приведенной ниже. В моем случае Cucumber.js завершает работу Node до того, как регистратор асинхронных файлов сможет сбросить, среди других возможных ожидающих операций в цикле событий.

https://nodejs.org/api/process.html#process_process_exit_code

Важно отметить, что вызов process.exit () заставит процесс завершиться как можно быстрее, даже если есть еще ожидающие асинхронные операции, которые еще не завершены полностью, включая операции ввода-вывода для process.stdout и process.stderr . В большинстве случаев в явном вызове process.exit () нет необходимости. Процесс Node.js завершится сам по себе, если в цикле событий не будет отложена дополнительная работа. Свойство process.exitCode может быть установлено, чтобы сообщить процессу, какой код выхода использовать, когда процесс завершается корректно.

help wanted good first issue

Самый полезный комментарий

Я не решаюсь сделать это, поскольку думаю, что другие пользователи могут столкнуться с проблемами (в основном я думаю о тех, кто использует его для тестирования браузера, и именно там я помню, как он зависал). Также эта рекомендация по узлу существует только в версиях 6 и 8. Ее нет в версии 4, которая будет поддерживаться до апреля 2018 года (когда узел откажется от поддержки). Я бы хорошо добавил для этого опцию CLI. Что-то вроде --drain-event-loop которое будет использовать process.exitCode вместо process.exit.

Все 6 Комментарий

Можете ли вы дождаться, пока регистратор завершит определение перехвата / шага? Я осторожно помню, что было много случаев, когда cucumber-js не выходил, поскольку он ждал, пока все выйдет из цикла событий

Текущий обходной путь, который я использую, - это произвольный setTimeout в AfterFeatures , но после того, как я узнал ранее о exitCode и пересмотрел этот метод из-за предстоящей амортизации registerHandler I Я редактировал локальный run.js, и, похоже, он отлично работает. Это определенно стоит пересмотреть из-за 1) официальной рекомендации Node, 2) задержки для каждого процесса, которую вводит фиктивный setTimeout при параллельной работе и 3) при выполнении Cucumber другим процессом Node.

Я думал о том, что он висит вечно, но разве тайм-аут на отдельных шагах не позаботится о чем-то бесконечном? Должен быть изящный способ запросить выход с тайм-аутом в Node без немедленного завершения.

registerHandler('AfterFeatures', function (features, callback) {
  setTimeout(callback, 1000);
});

Я не решаюсь сделать это, поскольку думаю, что другие пользователи могут столкнуться с проблемами (в основном я думаю о тех, кто использует его для тестирования браузера, и именно там я помню, как он зависал). Также эта рекомендация по узлу существует только в версиях 6 и 8. Ее нет в версии 4, которая будет поддерживаться до апреля 2018 года (когда узел откажется от поддержки). Я бы хорошо добавил для этого опцию CLI. Что-то вроде --drain-event-loop которое будет использовать process.exitCode вместо process.exit.

Просто хочу добавить, что эта проблема представляет реальную проблему для запуска Cucumber.js в качестве дочернего процесса. Я делаю это с помощью --format json , и если мой вывод превышает размер блока 8K потока stdout, я получаю только первый блок до того, как process.exit Cucumber преждевременно завершает дочерний процесс, усекая выход. Я удалил process.exit и проблема была решена.

Я постараюсь отправить запрос на перенос в ближайшее время.

Я выдвинул запрос на перенос , хотя он неполный в @charlierudolph ; Я не делал часть флага CLI.

У меня есть обходной путь для конкретной проблемы, с которой я столкнулся, заключалась в том, что запуск Cucumber.js в дочернем процессе с форматером JSON усекал вывод после первого фрагмента потока stdout, потому что process.exit - такой жесткий выход этот дочерний процесс не ждет остатка. Решением было просто добавить | cat к моей команде дочернего процесса, и это позволило мне получить полный вывод в родительском процессе.

Любой будет приветствовать добавление к вышеупомянутому PR, или может быть уместно объединить его как есть через несколько месяцев, когда закроется версия 4.

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги