0

私はサンプルアプリケーションを読んで、ノードを学習しようとしました。また、boot() でモデルとコントローラーをロードするときに、いくつかが readdirSync メソッドを使用していることに気付きました。

例えば:

    var models_path = __dirname + '/app/models'
var model_files = fs.readdirSync(models_path)
model_files.forEach(function(file){
  if (file == 'user.js')
    User = require(models_path+'/'+file)
  else
    require(models_path+'/'+file)
})

これは私にはアンチノードのようです。これは、ノードが好む「すべてを非同期にしよう」の反対です。

このような同期ファイル読み取りが良い考えになるのは、いつ、そしてなぜですか?

4

2 に答える 2

3

おそらく、初期化をより簡単にするためです。速度のために非同期性が問題にならない場合。多くの同時リクエストを処理しようとしているわけではありません。

同様に、アプリケーションの存続期間中に使用される、起動時に初期化する変数にアクセスする必要がある場合、アプリケーション全体をコールバックでラップする必要はありません。

于 2012-05-21T10:24:39.733 に答える
0

続行する前にすべてのデータが利用可能であることを確認する必要があり、順序を維持する必要がある場合は、同期読み取りが必要です。つまり、プロセスをブロックし、サーバーの起動時 (HTTPS の証明書ファイルの読み取りなど) など、他のことを (誰に対しても) できないようにする必要がある場合です。

Lenが提案したように、コーディングをより簡単に保つために、同期読み取りが望ましい場合があります。しかし、あなたが提案するように、パフォーマンスとシンプルさをトレードオフしています。実際、この場合、多くのシーケンス ヘルパー ライブラリの 1 つを利用することをお勧めします。これらは、ネストされたコールバックとシーケンスの問題を処理することで、コードを大幅に簡素化します。

そしてもちろん、あなたが例として提供するコードはかなり危険です - 読み取りが失敗した場合はどうなりますか?

以下に 3 つのライブラリを示します。

  • Streamline.js非同期の js/coffeescript を同期のように記述できます。コールバックを「_」に置き換えるだけです。ただし、スクリプトをコンパイルするか、ローダーを介して実行する必要があります。
  • async - よく考えられ、文書化されているようで、実際のアプリを構築した数人が推奨しています。
  • async.js - 連鎖可能、fs も公開 (readdir、walkfiles、glob、abspath、copy、rm を含む - 汎用ではなく fs に焦点を当てています)

このリンクも役立つかもしれません: The Tale of Harry - 神話上のプログラマーが従来のプログラミングからコールバックベースのプログラミングに移行する方法と、彼が最終的に使用するパターンについての説明。また、非同期ライブラリで提示されるパターンについての有用な洞察。

于 2012-05-22T11:23:50.217 に答える