2016-04-10 8 views
0

私はnode.jsを初めて使用しています。 Googleでnode.jsスレッドループ(イベントループ)の外で自分のコードを実行する方法については既に研究していますが、回答を得ることはできません。node.jsスレッドループ外のコード実行

ノードイベントループ外で実行される関数を作成するにはどうすればよいですか。 例えば、マングースで、それは

scheme.save(function(err)){ 
    console.log('saved'); 
}); 

ノードが挿入コードを実行し、データを挿入するために使用すること、上記のサンプルでは(私のコールバックを実行するために、イベントループに戻って外部イベントループとを(セーブ機能)いくつかのロギング)。

私は

function getUser(id, callback) { 
    setTimeout(function() { 
     console.log('executed'); 
     callback(null, "jhon"); 
    }, 5000); 
    } 

    function display(err,user) { 
     console.log(user); 
    } 

    getUser(432, display); 
    console.log('this show first'); 

を試みるが、それは(新しい要求が処理される前に、それが5秒間イベントループを遮断する)同期を実行します。

上記のコードで5秒間イベントループをブロックしないように、同じ「保存」機能を実装するにはどうすればよいですか? トピックを読むことができますか?ありがとう。

+0

は、なぜあなたはそれのブロックイベントループと思いますか? –

+0

最新の質問をお読みください。 2つのタブで上記のコードを実行しようとしました。最初の 'jhon'ログが表示された後、2番目のログ 'this show first'がログに記録されます。私はそれが間違っているのですか? 「最初にこのショー」 「JHON」 「最初、この番組」 「JHON」 の代わり 'このショーは、最初 このショーは最初 ジョン john' – gitong0315

+0

間違って@セッシェンの答えは正しいです。 – gitong0315

答えて

0

@SteveCampbell氏によると、setTimeout(function() { /// }, 5000)はイベントループをブロックすると間違っていると言われています。 は、関数内のコードの実行を5秒間遅らせるだけです

これらの5秒間が最後の間、NodeJSエンジンは完全に動作可能であり、他のアクションを実行したり、ネットワーク要求を送受信したり、その他のI/Oを実行することができます。

enter image description here NodeJSイベントループの自然とそれを正しく利用するための方法でそれらのリソースの上でCheck:

UPD

"コードがrssデータを取得しています" - はタスクを作成し、タスクが完了したときに実行されるコールバックを追加するだけです。それは何もブロックしていません、それはNodeJS非同期コードの背後にある主なクールなアイデアです。ここexample rss reader in NodeJS チェック:

//1 - task configuration 
var req = request('http://somefeedurl.xml') 
    , feedparser = new FeedParser([options]); 

// here while rss is being retrieved in a separate sub task 
// nodejs engine can do other tasks 

//2- callback for error 
req.on('error', function (error) { 
    // handle any request errors 
}); 
//2- callback for response with data 
req.on('response', function (res) { 
//... 
+0

更新された質問をお読みください。私は2つの分離タブで上記のコードを実行しようとします。最初の 'jhon'ログが表示された後、2番目のログ 'this show first'がログに記録されます。 \t 「このショーファースト」「ジョン」「このショーファースト」「ジュホン」「このショーファースト」「このショーファースト」「ジョン」「ジョン」 – gitong0315

+0

getUser関数でrssデータを取得するような長時間実行しているコードを実行していますか?イベントループをブロックするか、自動的に新しいプロセスを作成しますか?それは本当の質問です。 settimeoutは長いコードをシミュレートする私のアプローチです – gitong0315

+0

更新された答えを確認してください – shershen

関連する問題