В стековых трассах Node.js нет пользовательского кода
При отладке кода Node.js я часто сталкиваюсь со стеками вызовов, которые не включают в себя код моей программы, а только код node_modules / не пользователя, несмотря на то, что текущая строка выполнения находится в моем коде. Это лишает смысла следовать за стеком вызовов, чтобы увидеть путь выполнения через код моего приложения.
Почему мои исходные файлы не отображаются в стеке вызовов?
1 ответ
Похоже, что вы смотрите на трассировку асинхронного стека, где ваш код не находится в стеке, за исключением вашего обратного вызова, потому что ваш код размотан / завершен, а затем был вызван асинхронный обратный вызов.
Все .then()
обработчики для всех обещаний вызываются асинхронно с чистым стеком. Это согласно спецификации обещания. Таким образом, обещания всегда позволяют текущему потоку выполнения завершиться и развернуться, а затем они запускаются .then()
обработчики без пользовательского кода в стеке при вызове обратного вызова. То, что вы описываете, это то, как будет работать синхронный код, а не асинхронный код. Мы могли бы говорить более конкретно, а не теоретически, если бы вы показали реальный код и описали, где вы смотрите на стек вызовов.
За асинхронным прогрессом часто приходится следить за ведением журнала, потому что вы не можете легко пройти через него, и вы не можете просто разбить и посмотреть трассировки стека.
В качестве более простого примера:
function foo() {
setTimeout(() => {
console.log("timer"); // set breakpoint here
}, 100);
}
foo();
Функция foo()
завершил выполнение и вернулся до вызова обратного вызова, и поэтому в трассировке стека не будет никакого кода (кроме только обратного вызова).
В то время как .then()
обработчики используют немного другой планировщик, чем setTimeout()
Принцип тот же.