1。Node.jsの役割、
I/Oの意味(I/Oは、キーボードタイプのテキスト、入力、テキストが画面に表示されるなど、入力/出力の略語です。マウスの動き、マウスが移動し、マウスが画面に移動され、ターミナル入力が見られます。
node.jsが解決したい問題(プロセス入力、高い並行性。たとえば、オンラインゲームに何百万人ものゲーマーがいる可能性があり、数百万の入力など)(node.jsはカテゴリに適しています。Node.jsは、アプリケーションがネットワーク上のデータを送信して受信する必要がある場合に最も適しています。
並行性の意味(同時性という用語は、物事が同時に起こることと互いに相互作用する可能性があることを説明しています。ノードのイベントI/Oモデルにより、マルチスレッドの非同期I/Oにおけるインターロックと並行性の一般的な問題を回避することができます)
デモンストレーションネットワークI/O
JSコード
var http = require( 'http')、urls = ['www.baidu.com'、 'www.10jqka.com.cn'、 'www.duokan.com']; function fetchpage(url){var start = new date(); http.get({host:url}、function(res){console.log( "from:" + url); console.log( "request teak:"、new date() - start、 "ms");}); } for(var i = 0; i <urls.length; i ++){fetchPage(urls [i]); }node.jsという名前
端末でノードnode.jsを実行します
出力:
Node.jsに3つのURLにアクセスし、受信した応答とそれがかかった時間を報告する必要があります。
出力時間が2回異なることがわかります。さまざまな要因、DNS要求を解決する時間、忙しいサーバープログラムなどの影響を受けます。
JavaScriptがイベント主導の言語であるのはなぜですか
JavaScriptは、元々ドキュメントオブジェクトモデル(DOM)に関連付けられていたイベントアーキテクチャを中心に展開します。開発者は、イベントが発生したときに物事を行うことができます。これらのイベントには、ユーザーが要素をクリックする、ページが読み込みなどを完了するなどです。イベントを使用して、開発者はイベントが発生したときにトリガーされるイベントのリスナーを書くことができます。
2。コールバック
1。コールバックとは何ですか
2。コールバックを分析します
コールバックとは、関数を別の関数への引数として渡すことを指し、通常、最初の関数が完了した後に呼び出されます。
例:たとえば、jQueryのHide()メソッド、
JSコード
1、$( "p")。非表示( 'slow'); 2、$( "p")。非表示( 'slow'、function(){alert( "段落が隠されました")});コールバックはオプションです。
1コールバックは必要ありません
2。コールバックがあります。段落が隠されている場合、それは呼び出され、アラートプロンプトが表示されます。
コールバックの有無にかかわらずコードの違いを確認するために
JSコード
$( "p")。非表示( 'slow'); alert( "段落は現在隠されています")
1.コールバックはなく、実行命令は同じです。ただし、P段落が完全に隠されていないことがわかり、アラートが出てきます。
2。コールバックがあり、非表示が完了した後に実行が行われます。
コールバックを分析します
JSコード
function Have Breakfast(Food、Drink、Callback){console.log( '' + food + 'のbarakfastを持っている、' + drink); if(callback && typeof(callback)=== "function"){callback(); }} havebreakfast( 'foast'、 'coffee'、function(){console.log( '朝食を終えた。仕事に行く時間!');});出力:
フォームのバラクファースト、コーヒーフィニッシュされた朝食。仕事に行く時間!
3つのパラメーターで作成された関数は次のとおりです。3番目のパラメーターはコールバックであり、これが関数である必要があります。
HaveBreakFast関数は、コンソールに食べるものを記録し、パラメーターとして渡されたコールバック関数を呼び出します。
node.jsのコールバックの使用方法
node.jsのディスクからファイルコンテンツを読み取るためにファイルシステムモジュールを使用する例
JSコード
var fs = require( 'fs'); fs.readfile( 'somefile.txt'、 'utf8'、function(err、data){if(err)throw err; console.log(data);});結果は、somefile.txtのコンテンツです。
1。FS(Files -System)モジュールは、スクリプトで使用するようにリクエストされています
2。ファイルシステム上のファイルパスは、fs.readfileメソッドの最初のパラメーターとして提供されます。
3. 2番目のパラメーターはUTF8で、これはファイルのエンコードを示します
4。fs.readfileメソッドの3番目のパラメーターとしてコールバック関数を提供します
5.コールバック関数の最初のパラメーターはERRです。これは、ファイルを読み取るときに返されるエラーを保存するために使用されます。
6.コールバック関数の2番目のパラメーターはそれを押すことであり、ユーザーは読み取りファイルによって返されるデータを保存します。
7.ファイルが読み取られると、コールバックが呼び出されます。
8。errが真の場合、エラーがスローされます。
9.ERRがfalseの場合、ファイルからのデータを使用できます。
10。この場合、データはコンソールに記録されます。
もう1つはHTTPモジュールです。HTTPモジュールにより、開発者はHTTPクライアントとサーバーを作成できます。
JSコード
var http = require( 'http'); http.get({host: 'shapeshed.com'}、function(res){console.log( "got response:" + res.statuscode);})。結果:対応が得られました:200
1.スクリプトで使用するためにHTTPモジュールをリクエストしてください
2。http.get()メソッドに2つのパラメーターを提供します
3.最初のパラメーターはオプションオブジェクトです。この例では、shapeshed.comのホームページを取得する必要があります
4. 2番目のパラメーターは、パラメーターとして応答を伴うコールバック関数です
5.リモートサーバーが対応する関数を返すと、コールバック関数がトリガーされます。
6.コールバック関数に応答ステータスコードを記録します。エラーがある場合は、記録できます。
次に、4つの異なるI/O操作が起こっていることを確認しましょう。それらはすべてコールバックを使用しています
JSコード
var fs = require( 'fs')、http = require( 'http'); http.get({host: 'www.baidu.com'}、function(res){console.log( "baidu.com");})。 fs.readfile( 'somefile.txt'、 'utf8'、function(err、data){if(err)throw err; console.log( "somefile");}); http.get({host: 'www.duokan.com'}、function(res){console.log( "duokan.com");})。 fs.readfile( 'somefile2.txt'、 'utf8'、function(err、data){if(err)throw err; console.log( "somefile2");});どの操作が最初に戻るかを知ることができますか?
推測では、ディスクから読み取られた2つのファイルが最初に返されます。これは、ネットワークに入る必要がないためですが、ファイルサイズがわからないため、最初にどのファイルが返されるかを言うのは難しいです。 2つのホームページを取得するには、スクリプトはネットワークに入る必要があり、応答時間は多くの予測不可能なものに依存します。 node.jsプロセスは、トリガーされていない登録されたコールバックが発生するまで終了しません。コールバックは最初に予測不可能性を解決します。また、同時性に対処する効率的な方法でもあります(または一度に複数のことを行います)。
これが私の実行の結果です
同期コードと非同期コード
まずコードを見て、コードを同期(またはブロック)します
JSコード
function Sleep(milliseconds){var start = new date()。getTime(); while((new date()。gettime()-start)<millioneconds){}} function fetchpage(){console.log( 'fetching page');睡眠(2000); console.log( '要求ページから返されたデータ'); } function fetchapi(){console.log( 'fetching api');睡眠(2000); console.log( 'API'から返されたデータ); } fetchPage(); fetchapi();スクリプトが実行されているとき、fetchPage()関数が呼び出されます。戻るまで、スクリプトの実行がブロックされます。 fetchPage()関数が戻る前に、プログラムをfetchapi()関数に移動することはできません。これはブロッキング操作と呼ばれます。
node.jsはこのコーディングスタイルをほとんど使用することはありませんが、コールバックを非同期に呼び出します。
次のコードを見てください、
JSコード
var http = require( 'http'); function fetchpage(){console.log( 'fetching page'); http.get({host: 'www.baidu.com'、path: '/?delay = 2000'}、function(res){console.log( 'console.log(' requesting page ');})。 } function fetchapi(){console.log( 'fetching api'); http.get({host: 'www.baidu.com'、path: '/?delay = 2000'}、function(res){console.log( 'データはapi');})。 } fetchPage(); fetchapi();このコードが許可されている場合、fetchPage()関数が返されるのを待つことなく、fetchapi()関数はすぐに呼び出されます。コードはコールバックを使用してブロックされます。呼び出されると、両方の関数がリモートサーバーの返品を聞き、コールバック関数をトリガーします。
これらの関数の返品順序は保証することはできませんが、ネットワークに関連していることに注意してください。
イベントループ
node.jsは、JavaScriptのイベントループを使用して、それが提唱する非同期プログラミングスタイルをサポートします。基本的に、イベントループにより、システムは最初にコールバック関数を保存してから、イベントが将来発生したときに実行できます。これは、データベースの返信データまたはHTTPリクエスト返信データです。コールバック関数の実行はイベントが逆転するまで延期されるため、実行を停止する必要はなく、コントロールフローがノードランタイム環境に戻り、他のことが発生する可能性があります。
Node.jsは、ネットワーク内のデータフローの不確実性を処理するように設計されているため、ネットワークプログラミングフレームワークと見なされることがよくあります。このようなデザインに貢献するのは、イベントループとコールバックの使用であり、ネットワークまたはI/Oイベントに応答する非同期コードを作成できるプログラマーのようなものです。
従うべきルールは次のとおりです。関数は迅速に戻り、関数をブロックする必要はなく、長期にわたる操作を別のプロセスに移動する必要があります。
node.jsに適していないものには、大量のデータの処理や計算を長時間実行することが含まれます。 node.jsは、ネットワーク上のデータをプッシュし、即座に完了するように設計されています。