2017-06-11 24 views
0

私はノードバックエンドを書いていますが、私は非同期関数をどのように扱うべきか少し混乱します。私はprocess.nextTick()について読んだことがありますが、どれくらい頻繁に使うべきですか?私のコードのほとんどは、データベース呼び出しのようなコールバックに基づいています。しかし私は自分自身のいくつかの機能も持っています。それは非同期でなければなりません。Node.js非同期関数、process.nextTick()

これはどちらが非同期機能の良い例ですか?

function validateUser1(user, callback) { 

    process.nextTick(function() {  

    //validate user, some regex and stuff 

    callback(err, user); 

    }); 

} 

function validateUser2(user, callback) { 

    //validate user, some regex and stuff 

    process.nextTick(callback, err, user); 

} 

function validateUser3(user, callback) { 

    process.nextTick(function() {  

    //validate user, some regex and stuff 

    process.nextTick(callback, err, user); 

    }); 

} 

process.nextTickにすべてをラップする必要があるのか​​、コールバックだけをラップするのか分かりません。または両方?

全体として、node.jsのアイデアは、大きなものよりも小さな機能をたくさん書いて、他のイベントをブロックしないようにそれらを非同期的に呼び出すことです。

+0

「しかし、私はまた私自身のいくつかの機能を持っている、それはasyncを指定しなければならない」とはどういう意味:

あなたはより多くの背景情報を読みたい場合は、ここでは資源のですか?なぜそれが本質的に同期であれば非同期機能を作るのですか? – Thomas

答えて

1

CPUコード(I/Oなし)だけの場合はできるだけ遠くまで試行してください。コードを不必要に断片化する非同期関数や小さな関数は避けてください。

可能な限り、きれいで読み取り可能な線形コードを作成してください。ストリームI/O(ファイルまたはネットワーク)など、絶対に必要なときにのみ非同期に戻します。

これを考慮してください。たとえあなたが1000行以上のJSコードを持っていても、それは驚くほど速く実行されます。あなたは本当にそれを断片化する必要はありません(非常に深いループのように扱いにくいことが証明されていない限り、最初に測定する必要があります)!

リニアコードを最初にテストせず、実際に断片化する必要があることを確認すると、早すぎる最適化が行われてしまいます。これは保守性が悪いことです。

私は本当にこれですぐに行くと思います:

function validateUser1(user, callback) { 
    //validate user, some regex and stuff 
    callback(err, user); 
} 

し、可能な場合、完全に機能を削除する(しかし、これはあなたが残りのコードを書く方法の問題です)。

また、本当に必要ない場合はnextTick()を使用しないでください。多くのTCP/IPソケット、データベース接続、ログ、ファイルの読み込み、多くのI/Oを持つクラウドサーバーを実装しましたが、NOT私はnextTick()を使用しました。

+0

私は「小さな」機能には同意しません。ちょうど1つのタクを行う小さな関数は、あなたの頭を包むために簡単です。したがって、エラーが発生しにくく、テストが簡単で、ノードによって最適化するのが簡単です。そして、もしNodeがそれを考えるなら、それはとにかく大きな機能にインラインにします。 "あなたのコードを断片化する小さな関数"を使うことは今のところです。データフローのみをメイン関数に保存し、実装の詳細を小さな関数に抽出するための良い方法です。あなたはそれらに意味のある名前を付ける必要がありますが、怠け者ではなく、すべてを短縮しようとします。 – Thomas

+0

私はあなたが正しいと思う、コードは実際に非常に高速に実行されます。私は別の機能でそれを維持します。とにかく、他のサーバーへのdb呼び出しとapi呼び出しがたくさんあるリニアコードを持つのは難しいです。関数を次々に定義してコールバックとして渡すので、コードを見てもかなり線形です。 –

+0

私はあなたに本当に同意します。 * tiny *を定義するだけの問題です。私は* small *関数も使用していますが、小さなものは '{return a pid

1

process.nextTick()は、イベントループを続行する前にコールバックを実行します。これはスレッドをブロックし、process.nextTick()に渡されたコールバックが暗号化、PIの計算などCPUの高価なものである場合に着信接続が処理されないようにします。

あなたの機能を非同期process.nextTick()に渡します。そうではありません。 process.nextTick()に何かを渡すと、次回イベントループが実行される前に実行されます。これにより、実行する関数がメインスレッドで実行されているため、関数はブロックされません。 I/O操作だけが非ブロックになることができます。

したがって、CPUを大量に使用する関数をprocess.nextTick()でラップするか、すぐに実行するだけで無関係です。 https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick

+0

CPUの集中的な機能があれば、それは実行に時間がかかるでしょう、私はprocess.nextTickでコード自体を破る必要があります。いくつかの計算を行うのと同様に、ダニを行い、計算を続けるなどします。 –

+0

はい。同様に、一番外側のループでは、オーバーフローしてすべてが詰まる前に、保留中のI/Oを処理できるようにプロセスが流れます。しかし、例えば1秒という一回限りの計算は耐えられる。あなたが避けなければならないのは**絶え間なくCPU **を占有していることです。 – pid

関連する問題