2015-09-06 3 views
5

Koaフレームワークを使用してノードJSのWebアプリケーションを作成しています。IntelliJまたはWebStormのジェネレータを使用してJSをデバッグする方法を改善する

すべてのフロー制御は、コールバックの代わりにジェネレータを使用して行われます。実際のフローはそうではありませんが、コードはシーケンシャルに見えます。とにかく、それはコールバック地獄よりもはるかにきれいに見えます。

function *findUserById(userId) 
{ 
    var user = yield getUserOrError404(userId); 
    yield loadAdditionalData(user); 
    yield data.users.save(user); 
    return user; 
} 

Howeve 1つの難点がある:非常にうまく機能しません、私のIDEでyield S(のIntelliJ IDEA)でコードのステップは

はここKOAと書かれたコントローラ機能の簡単な例です。実行がyieldステートメントの行に来たら、私はちょうど "ステップオーバー"すれば、実行フローがスタック上でkoaコードになります(実際にはジェネレータの実際の実行フロー、yield文とNodeイベントループ)。

現在、次の文にブレークポイントを設定する必要があります。デバッガを一時停止し、頻繁に次の行にして、[プログラムの再開]ボタンをクリックします。

2つ以上のyield文があると面倒になることがあります。

yieldステートメントを「通常の」シーケンシャルステートメントのように進めることができるジェネレータ重いJSコードをステップ実行するための良い方法(トリック、プラグイン、など)はありますか?

答えて

3

Run To Cursorコマンドのジョブのように聞こえる - これは、実行後に削除される軽量ブレークポイントのように効果的に実行され、カーソルが現在ある行に到達します。

this gistこれに使用できるボタンのスクリーンショットと、これが動作するかどうかを確認するために使用したテストハーネスファイルについては、少なくともPhpStormではWebStormと同じ機能を期待していますJSと同じくらい)。

編集:IntelliJでもうまく動作します。スクリーンショットに表示されているボタンの他​​に、行を右クリックしてコンテキストメニューで[Run to cursor]をクリックして起動することもできます。または[alt] + [F9]キーボードショートカット。

+0

これは、すでにブレークポイントメソッドよりも大幅に改善されています。ありがとうございました !私はジェネレータ呼び出しを透過的に踏み越えるよりエバリュエートな「エミュレーション」メソッドが必要だったと思います。私はちょっと待つつもりだ、誰かがそのような魔法を思い付くかもしれない。そうでなければ、私はこの答えを受け入れるだろう。 –

+0

ああ、通常のデバッグセッションにも便利です) –

+0

IntelliJのようなツールでは、yieldステートメントを透過的に実行できる「ジェネレータ対応」デバッグモードがあります。 –

関連する問題