ホームページ  >  記事  >  ウェブフロントエンド  >  nodejs チュートリアル 非同期 I/O_node.js

nodejs チュートリアル 非同期 I/O_node.js

WBOY
WBOYオリジナル
2016-05-16 16:30:461457ブラウズ

はしがき

私のイメージでは、非同期は ajax で初めて登場しました。当時私はまだ .net を開発していましたが、実際に .net には非同期コントロールが登場しました。

ようやく非同期ではないことが分かりましたが… では、フロントエンドは非同期で多用されているので、非同期プログラムでないと、自分が書いたNodeJを作ったと言うのは恥ずかしいことになります。 JavaScript による

非同期プログラミング モデルの機能も引き継がれていますが、非同期には多くの利点がありますが、設計にとっては悪夢です。そのため、設計の難易度が高くなります。

しかし、非同期はパフォーマンスの向上とユーザーエクスペリエンスに革命をもたらしました。そのため、今日は NodeJS の非同期機能を簡単に学びます。

非同期 I/O

実際、オペレーティング システム レベルでは、I/O メソッドはブロッキングとノンブロッキングの 2 つだけです

ブロッキング モデルでは、アプリケーションは結果を返す前に I/O が完了するまで待つ必要があり、その特徴はバックエンドを呼び出し、システムがすべての操作を完了するまで待機することです。ノンブロッキング呼び出しはすぐに返されますので、お待ちください。

初めて本を読みましたが、ここでの説明が明確ではないと感じました。非同期モデルは実際には非常に大きく、認識のレベルが向上しただけです。簡単な例を示します。

現在、検索ページとリスト ページの 2 つの単一ページ アプリケーション ビューがあり、検索する際には、さまざまなチャネルを通じて検索する必要があり、サードパーティは特定のチャネルからデータを取得します。

もちろん、現時点では非常に遅いです。A から B に直接切り替えてから、B にデータをロードするためのローディング ボックスなどを作成しても問題はありません。しかし、問題はアニメーションが必要なことです。 A から B に切り替えるエフェクト

これには、切り替え時に Bview レンダリングが終了している必要があります。少なくとも、プロセス内でデータを取得してレンダリングを開始することはできないため、現時点では、非同期でデータを要求する場合でも、非同期を使用するのはそれほど簡単ではない可能性があります。ページをロードするためのデータ取得

これは依然として読み込みをブロックしており、ビジネスの観点からこれを行う方法はありません

完璧なテクノロジーはありません。ブロックすると CPU 待機の無駄が発生するだけでなく、ロードが完了したかどうかを確認するためにポーリングが必要になる場合もあります (DOM が生成されたかどうかを検出するためにポーリングを使用したことがあります)。

NodeJs は、プロセスが開始されると無限ループを作成します。各 Tick のプロセスは、必要なイベントがあるかどうかを確認します。処理予定

存在する場合は、関連するイベントを取り出して実行し、存在しない場合はループを終了します

各 Tick プロセスでは、各イベント ループに 1 つ以上のオブザーバーがあり、処理するイベントがあるかどうかを判断するプロセスでは、イベントを処理する必要があるかどうかをこれらのオブザーバーに尋ねます。

HTML イベント モデルを例に挙げてみましょう

実際、HTML の場合、その各 DOM は Web ページの変更を監視します。DOM に addEventListener を提供した後、そのイベントのコールバック関数を登録します。登録したものは「コンテナ」オブジェクトに入れられます。現時点では、これらの関数は条件が満たされた後 (ページが変更されたとき) にトリガーされ、関連するイベントがコンテナから取得されます。実行されました

ここで、ページ上のポイントを 1 回クリックし、コンテナからクリック イベント コレクションを取り出し、関連する DOM を見つけて、これらの DOM のコールバック関数をトリガーします

イベントは、ユーザーのクリックまたはデータ変更から発生する可能性があります。Node では、イベントは主にネットワーク リクエストやファイル I/O から発生します。これらのイベントには、ファイル オブザーバーやネットワーク オブザーバーなどの対応するオブザーバーがあります。

これも典型的な生産/消費モデルです。非同期 I/O、ネットワーク リクエストによりイベントが生成され、イベントはさまざまなオブザーバーに配信され、オブザーバーはイベントを登録します。イベント ループはイベントの取り出しと実行を担当します。

追記: クリックを例に挙げると、各 DOM オブザーバーが最初にイベントを登録し、ページプロセスがページを継続的に監視し、ユーザーがページをクリックしてイベントを生成し、登録されたクリックイベントがコンテナから取得されて実行されます。 、

一般的な関数ロジックは当社によって制御されます:

コードをコピーします コードは次のとおりです:

var forEach = 関数 (リスト、コールバック) {
for (var i = 0, len = list.length; i callback(list[i], i, list);
}
}

非同期操作の場合、コールバック関数は開発者によって制御されません。js が呼び出されるたびに、移行製品リクエスト オブジェクトが生成されます。

コードをコピーします コードは次のとおりです:

fs.open = 関数 (パス、フラグ、モード、コールバック) {
bingding.open(pathModule._makeLong(path), stringToFlags(flags), モード, コールバック);
};

fs.open は、パスとパラメータに基づいてファイルを開き、関連するデータを取得します。内部的に c 関連インターフェイスを呼び出します。プロセス内で中間オブジェクトが生成され、その中ですべての状態が...

追伸: ずっと見ていると気分が悪くなりました

結論

以上はnodejsの非同期I/Oに関する個人的なまとめです。抜けや間違いがあればご指摘ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。