2016-04-13 4 views
0

Код функции (source code on github):В чем причина клонирования массива слушателей в функции emitMany nodejs/events.js?

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); 
    } 
} 

В этой строке:

var listeners = arrayClone(handler, len); 

массив слушателей, названный в этой области, как handler, клонируют, а затем его клон назначается к новая переменная с именем listeners. Интересно, для чего это полезно.

Я подозреваю, что из-за того, что).

Является ли мое объяснение правильным, или, может быть, есть что-то еще?

ответ

1

это потому, что, когда соответствующее событие генерируется, обработчик может добавить/удалить обработчик для этого самого события, таким образом, изменяя массив, который повторяется.

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

второй обработчик не должен вызываться, когда «бар» событие вызывается в первый раз, таким образом, массив обработчиков должен быть клонированы перед выполнением обработчиков.

1

Такое поведение для emit() в целом (а не только внутренняя emitAny()) и существует, по крайней мере, предотвращение ситуаций, когда обработчик событий добавляет себя в качестве обработчика событий для того же события (или аналогичных ситуаций), которые могли бы привести к неограниченной петле для один emit(). Например:

emitter.on('foo', function fooHandler() { 
    emitter.on('foo', fooHandler); 
});