Есть ли способ остановить срабатывание таймеров в Node в режиме отладки?

Я выполняю отладку узлов через VS Code, что в основном доставляет удовольствие, за исключением случаев, когда отлаживаемый сценарий содержит таймеры (запускаемые через setTimeout(), setImmediate() или setInterval().

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

Я вспоминаю, что в мире C# раньше был способ приостанавливать таймеры в режиме отладки, и Visual Studio автоматически заботилась об этом. Я хочу знать, доступно ли что-то подобное для отладки Node, с VS Code или без него.

Обратите внимание, что рассматриваемый код представляет собой сценарий на стороне сервера, написанный на JavaScript, без использования прокладок или предустановок. Версия Node - 10.0.0. Версия NPM - 6.2.0

Если таймер находится вне вашей программы и проверяет, жива ли ваша программа, и ваша программа остановлена ​​в точке останова, то вы просто застряли. Когда ваша программа останавливается в точке останова, она останавливается. Он не может отвечать на внешние запросы или запросы. Я постоянно это вижу при отладке серверов socket.io. Клиент socket.io думает, что сервер вышел из строя, когда он находится в точке останова (даже используя отладчик, который поставляется с node.js), поэтому он пытается повторно подключиться. Единственный известный мне способ избежать этого - отлаживать операторы console.info(), а не точки останова.

jfriend00 19.07.2018 01:57

Довольно уродливое решение - добавить фрагмент кода, который проверяет, находитесь ли вы в режиме отладки, и отменяет эти функции (например, const originalSetTimeout = setTimeout; setTimeout = function (...args) { if (somehowCheckIfCurrentModuleBelongsToYourCode) { /* do nothing /* } else { setTimeout.apply(this, ...args) } }

fardjad 19.07.2018 03:26

@farjad и jfriend00 благодарим вас обоих за ваши комментарии. Таймеры находятся в сторонней библиотеке, которую в идеале я не хочу редактировать. Похоже, другого варианта быть не может. Думаю, всегда можно было клонировать копию, чтобы с ней возиться и вернуться к исходной версии, когда это будет сделано. Думаю, оба ответа верны. Я оставлю это открытым еще на несколько дней, чтобы другие тоже оставили комментарии.

Cod.ie 19.07.2018 04:39

@ cod.ie Я только что заметил небольшую ошибку в своем примере: вам нужно вызвать originalSetTimeout внутри функции (вместо setTimeout). И принимая во внимание ваш последний комментарий, вместо того, чтобы проверять, вызывается ли setTimeout из вашего кода, вам нужно найти способ проверить, действительно ли он вызывается из сторонней библиотеки. Возможно, вам лучше временно изменить библиотеку.

fardjad 19.07.2018 05:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
271
0

Другие вопросы по теме