2016-08-16 14 views
1

コールバックと非同期の意味を理解していますが、ノードで非同期関数を実行する方法がわかりません。Nodejsが同期または非同期を知っている方法

例えば

、どのようにこの

var action = (function(data) { 
    result = data+1; 
    return result; 
}); 

http.createServer(function (req, res) { 
    var r = action(5); 
    res.end(r.toString()); 
}).listen(80); 

からこの

var action = (function(data,callback) { 
    result = data+1; 
    callback(result); 
}); 

http.createServer(function (req, res) { 
    action(5, function(r){ 
     res.end(r.toString()); 
    }); 
}).listen(80); 

違うのですか?

私はそれを非同期的にやっていると思いますが、ノードは同期や非同期をいつどのように知っているのか分かりません。同期モードではvar x = func(data);を実行していますか?

また、同期または非同期を使用するタイミングは?明らかに、+1を追加するときにそれを使用したくないので... IOタスクを実行するとき(例えばDBからの読み込み)に非同期を使用することはOKですか?

たとえば、ライブラリ暗号を使用して短い文字列(最大50文字)を暗号化していますが、この場合は既に非同期を使用しているはずです。

答えて

1

...

「あなたはdoesnの終わったら単にコールバックを渡して、それを呼び出す:)非同期されていないあなたの最初の例非同期の関数を作る。

非同期というのは、基本的に、Node:を「ここでは私のためにやって、私が他のものをやり続けるうちに完了したら教えてください」という意味です。

あなたの例は、将来の完了のためにNodeに何も渡していません。それは計算を行い、その直後にコールバックを呼び出すことです。これは機能的には2番目の例と同じです。ここではが返されます。計算結果はです。

しかし、あなたは非同期である何かにあなたの最初の例を変更することができます。ここでは

var action = (function(data,callback) { 
    setTimeout(function() { 
    result = data + 1; 
    callback(result); 
    }, 1000); 
}); 

、あなたがsetTimeoutを使用することにより、1秒間のコールバックを呼び出す遅らせるためにノードを言っています。一方で、Nodeは1秒間待機しても止まらないでしょう。それはより多くのHTTP要求を喜んで受け入れ、応答が送信される前にそれぞれ1秒遅れます。

syncまたはasyncを使用するタイミングは?

非同期コード「ウイルス」である:あなたが非同期な機能に依存している場合は、これらの機能を使用して、独自のコードも非同期する必要があります(一般的にコールバックを受け入れる、または非同期に対処するために別のメカニズムを使用することにより、 、約束のように)。

たとえば、ライブラリ暗号を使用して短い文字列(最大50文字)を暗号化していますが、この場合は既に非同期を使用しているはずです。

これは、使用している機能によって異なります。 AFAIK、cryptoのほとんどの暗号化機能は非同期ではないため、非同期に自分自身を非同期にすることはできません。

+0

私はいくつかのことをする関数を持っているとし、それがメインループをブロックしないように '背後に'実行したいとしたら、私はコールバックアクションを実行したいそれから私は何をすべきですか? 0msでタイムアウトを設定しますか? –

+0

@CarlosNavarroはおそらく['setImmediate'](https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)です。しかし、それを使っても奇妙なことにイベントループをブロックするわけではないことに注意してください。結局、JSはシングルスレッドなので、一度に1つのことしか "行う"ことができません。 – robertklep

0

どちらの例も同期して動作します。シンプルな非同期操作は、のsetTimoutのsetIntervalです。

ノードは実際にどのコードを実行しているか気にしません。 ブロックかどうか(blocking/non-blocking)できます。

つまり、 - あなたはevent loopです。プロセスが非同期の場合、プログラム制御をイベントループに渡すので、他のアクションノードを実行する必要があります。もしそうでなければ - 彼はいらない。私は非同期的にそれをやっている最初の例では推測

関連する問題