Node.jsコードをデバッグするとき、自分のプログラムのコードが含まれていないコールスタックが発生することがよくあります。現在実行中の行にもかかわらずnode_modules /私のコード内の場所。これは、コールスタックをフォローしてアプリケーションコードを通じて実行パスを確認するという目的を破ります。Node.jsスタックトレースにユーザコードが含まれていない
ソースファイルがコールスタックに表示されないのはなぜですか?
Node.jsコードをデバッグするとき、自分のプログラムのコードが含まれていないコールスタックが発生することがよくあります。現在実行中の行にもかかわらずnode_modules /私のコード内の場所。これは、コールスタックをフォローしてアプリケーションコードを通じて実行パスを確認するという目的を破ります。Node.jsスタックトレースにユーザコードが含まれていない
ソースファイルがコールスタックに表示されないのはなぜですか?
あなたのコードは、/完成巻き戻された後、非同期コールバックが呼ばれたので、あなたのコードは、コールバックを除き、スタックにない非同期スタックトレースを見ていることが表示されます。
すべて.then()
すべての約束事のハンドラはクリーンスタックと非同期に呼ばれます。それは約束の仕様です。したがって、コールバックが呼び出されたときにスタック上にユーザコードを持たないハンドラを実行して、.then()
ハンドラを起動すると、現在の実行スレッドが終了して解放されることを約束します。あなたが記述しているのは、同期コードが非同期コードではなく動作する方法です。あなたが実際のコードを示し、コールスタックをどこで見ているのかを記述すれば、理論的にではなくより具体的に話すことができます。
非同期の進捗状況は、簡単に突き抜けることができず、スタックトレースを破棄して調べることができないため、ロギングで追跡する必要があります。見て少しシンプルな例として
:
function foo() {
setTimeout(() => {
console.log("timer"); // set breakpoint here
}, 100);
}
foo();
機能foo()
は実行を終了し、コールバックが呼び出される前に返されたため、スタックトレースはちょうどよりあなたのコードのいずれかが(他の必要はありませんしましたコールバック)。
.then()
ハンドラはsetTimeout()
とは若干異なるスケジューラを使用しますが、原則は同じです。
あなたのコードが巻き戻されていない/終了した後に非同期コールバックが呼び出されたため、あなたのコードがスタックにない非同期のスタックトレースを見ていると思います。 – jfriend00
これが実際に問題であることを確認できる方法はありますか?私は約束を使用しており、それを親の約束どおりに返すので、元のソースコードからブレークポイントまでの途切れのないコールトレースが存在することが予想されます。 – sabrehagen
すべての約束事のすべての '.then()'ハンドラは、クリーンスタックと非同期に呼ばれます。それは約束の仕様です。したがって、常に現在の実行スレッドが終了して解放されることを約束し、コールバックが呼び出されたときにスタック上にユーザコードを持たない '.then()'ハンドラを起動します。あなたが記述しているのは、同期コードが非同期コードではなく動作する方法です。あなたが実際のコードを示し、コールスタックをどこで見ているのかを記述すれば、理論的にではなくより具体的に話すことができます。 – jfriend00