2016-12-11 16 views
1

に似たようなループを置くことができます。は、どのように私は私がやりたい、このサーバ例えば

var http = require('http'); 

const PORT=8080; 
var myvar = "Test: "; 

function handleRequest(request, response){ 
    response.end(myvar); 
} 

var server = http.createServer(handleRequest); 

server.listen(PORT, function(){ 
    console.log("Server listening on: http://localhost:%s", PORT); 
}); 

var asdf = 0; 

while(true){ 
     asdf += 1; 
     myvar += asdf; 
} 

のvar空自の作品上記のコードが、私はそれので、whileループを入れたときに、それはしていませんサーバーが動作するための時間はありません。

しかし、私はこれを行う方法がわかりません。私は答えを探していましたが、人々はwhileループを停止し、要求を処理してからループを続行するようなことを言うが、私はループを止めたくない。いくつかのスレッディングを実装しなくても可能かもしれないと思ったが、最初はnode.jsを使い慣れていないし、ロックなどの実装を想像していないので、いくつかの意見を聞きたい。

+0

このwhileループで何を達成したいですか?あなたの目標が何であるか分かっていれば、非同期の代替案があるかもしれません。 – haxxxton

+1

ノードはシングルスレッドです。複数のハンドラが必要な場合は、ノードクラスタと合計番号を作成できます。クラスタの<= no.of cpusはマシン内にあります。 – Jain

+0

中には、私はいくつかのピンの状態、ちょうど0と1を読んでいると私はサーバーがすべてのピンの現在の状態である応答したい。問題は、ピンの状態がいつ変わるのか分かりません。そのため、私はそれを絶えず読んでいます。 –

答えて

3

node.jsのJavascriptはシングルスレッドでイベント駆動型です。着信イベントは、実行中のJavascriptの実行が完了してシステムに戻ったときにのみ処理されます。

このように、あなたのサーバー上の他のJavascriptは実行できないので、whileループで何かを永久にループすることはできません。適時に着信要求を処理するはずのサーバーのために死んでいるイベントは処理できません。

Node.jsはイベント駆動型のシステムです。アクティビティは、イベント(タイマー、ネットワークコールバック、その他の非同期コールバックなど)を介してスケジュールする必要があります。長時間実行されているループは、サーバー全体が他のことをするのをブロックします。

ピンの状態を定期的にチェックし、基本的なハードウェアドライバがイベントドリブンインターフェイスを提供しないようにするには、おそらくsetInterval()またはsetTimeout()を使用してハードウェアの状態をポーリングします。ポーリングの間隔を短くしないようにして、サーバーが他の作業を行うのに多くの時間を費やさないようにしてください。

// poll the pin state 
setInterval(function() { 
    let pinState = getPin(); 
    if (pinState === someValue) { 
     // do something 
    } 
}, 100); 

例として、屋根裏ファンコントローラとして機能するnode.jsを実行するRaspberry Piがあります。それには、2つの温度プローブが接続されています(外気温度用と屋根裏空気温度用)。これは10秒ごとにsetInterval()を使用して2つの温度値をチェックし、屋根裏ファンをオンまたはオフにする必要があるかどうかを決定します。

node.jsのタイマーのポーリングを避けるのは理想的です。むしろ、ピン状態またはハードウェアデバイスのいくつかの重要な変更に対してコールバックを登録できるようにする基礎となるドライバが必要です。しかし、時々あなたのドライバーはこれをしないので、あなたは昔ながらの "ポーリング"に改造する必要があります。

1

データを連続的に処理する場合は、setInterval関数を使用することができます。この関数は、小さな間隔で連続して関数を呼び出します。残りのコードを実行する時間が与えられます。

// synchronous code, with a while loop 
while(true) { 
    // do something 
} 
// NOTE: anything after this never runs 

// asynchronous code, with setInterval 
setInterval(function() { 
    // do something 
}, 10); 

ここでは、コードを実行するたびにミリ秒単位で表します。ほとんどの目的(ピンの連続読み取りなど)では、小さな数値(10ミリ秒や1秒あたり100回など)は正常に動作するはずです。

0

私は確信していませんが、http経由で自分のノードサーバーにリクエストを送信したり、restlerノードモジュールを使用したりすることはできます。

function recursive() { 
    http.request(url, function(err, res) { 
     recursive(); 
    }) 
} 

https://nodejs.org/api/http.html#http_http_request_options_callback

そして、あなたはあなたの再帰を開始したいときに、このメソッドを呼び出します。

関連する問題