2016-04-13 5 views
0

機能コード(source code on github):この行のnodejs/events.jsのemitMany関数のリスナー配列を複製する理由は何ですか?

function emitMany(handler, isFn, self, args) { 
    if (isFn) 
    handler.apply(self, args); 
    else { 
    var len = handler.length; 
    var listeners = arrayClone(handler, len); 
    for (var i = 0; i < len; ++i) 
     listeners[i].apply(self, args); 
    } 
} 

handlerこの範囲で指定リスナーの配列は、クローニングされ、そしてそのクローンが割り当てられている

var listeners = arrayClone(handler, len); 

新しい変数listenersとなります。私はこれが何のために役に立つのだろうかと思います。

リスナーが自分自身をリストから削除する可能性があり、そのアクションがforループ内のカウンタを破壊する可能性があると思われます(リスト項目のインデックスは削除後に変更されますが、カウンタiは盲目的にそれ)。

私の説明は正しいのでしょうか、それとも何か他のものがありますか?

答えて

1

これは、それぞれのイベントが発生したときにハンドラがそのイベントのハンドラを追加/削除して、繰り返し処理される配列が変更されるためです。

foo.on('bar', function() { 
    foo.on('bar', function() { // should not be invoked now/but for the next and subsequent events 
    }) 
}) 

「バー」イベントが初めて発射されたときに、第2のハンドラは、このようにハンドラの配列は、ハンドラを実行する前にクローン化されなければならない、と呼ばれるべきではありません。

1

この現象は、一般的に(emitAny()の内部だけではなく)emit()です。イベントハンドラが同じイベント(または同様の状況)のイベントハンドラとして自身を追加する状況を少なくとも防ぐために存在します。単一のemit()

関連する問題