1

最近、node.jsを使い始めました。node.jsの非同期動作は、、、の3つの方法eventsで使用できることを引用しています。streamcallback

イベントとストリームはemit,pipeイベントに対して機能し、真に非同期になりますが、process.nextTick()が使用されない限り、関数が返される前に実行されるため、コールバック非同期はどのようになりますか。

イベント:

event.on('data',function(data){

});

折り返し電話:

function(data,cb){
 // do something with "data"
 cb();
 return;   
}
4

3 に答える 3

1

コールバックを持つ関数を詳しく見てみましょう。

function(data, cb) {
 // do something with "data"
 cb();
 return;
}

ここに 2 つの大きなエラーがあります。

1) コールバック関数がある場合、return を使用する理由はありません。Return は、すぐに応答を返す同期アクションがある場合にのみ使用されます (後でコールバックがトリガーされるのを待つ必要はありません)。

2) コールバックをすぐに実行しません。意味がありません。コールバックを使用せずに return ステートメントを使用するか (実際には非同期関数がない場合)、結果を取得するときにコールバックを実行します。

より良い例:

function (data, cb) {
  // you make an Ajax call and 
  // you don't know when the callback will be triggered
  makeAjaxCall(data, cb);
}
于 2012-05-29T06:29:46.810 に答える
1

コールバックが必ずしも非同期 I/O を意味するわけではないという点で、あなたは正しいです。

EventEmitter の .emit が次のティックではなく、すぐに機能するという意味で、イベントは必ずしも非同期でもありません。

var EventEmitter = require('events').EventEmitter;

var emitter = new EventEmitter();

emitter.on('ev', function(x) { 
    console.log("received event ", x);
});

console.log("Hello");
emitter.emit('ev', "X");
console.log("World");

結果:

Hello
received event  X
World 

ただし、コールバックは次の方法で「非同期」にすることができます。

  • process.nextTick() を使用します。これにより、コールバック内の実際の I/O 操作が非同期になりません。次のティックまで実行を延期するだけです。一部の操作がブロックされると、イベント ループもブロックされます - このティックではなく次のティックで。

    function(data, cb) {
        process.nextTick(function() { doSomethingWith(data); cb(); })
    });
    
  • 非同期 I/O 操作によってトリガーされることがわかっているイベントから、指定されたコールバック関数を呼び出す

    function(data, cb) {
        emitter.startIO();
        emitter.on('someIOEvent', function(e) { 
            doSomethingWith(data,e); 
            cb(); 
        });
    });
    
  • 非同期であることが知られている別のコールバックベースの関数を使用します。ノードコアとノードのモジュールのほとんどの機能はこのようなものです。

    function(data, cb) {
        otherFunction(data, function(moredata) { 
            doMoreStuffWith(moredata, data); cb(); 
        });
    });
    
于 2012-05-29T11:42:57.667 に答える
0

この場合、コールバックを含む関数は非同期で実行されていませんが、そのような関数を非同期で使用できる場合もあります。

function foo(data, callback) {
    // do something with the data
    callback();
}

function bar() {
    // this will be called as a callback from foo()
}

setInterval(function() { foo(data, bar) }, 1000);
console.log('this is displayed immediately');

foo()毎秒実行するようにスケジュールされており、非同期で実行されていることがわかります。ただし、コールバックの存在により、関数の外部から追加の動作を設定できますfoo()。たとえばfoo()、さまざまなコールバックで呼び出されるいくつかのケースを設定して、さまざまなアプリケーション ロジックを作成できます。

于 2012-05-29T07:43:29.900 に答える