2013-08-24 6 views
0

Я столкнулся с a presentation (слайд 50-51), где автор дает пример того, как выполнять обратные вызовы из 10000 одинаковых файлов в Node.Переменные популяции и обратные вызовы в node.js

// Batching wrapper around the real FS.readFile 
var requestBatches = {}; 
function batchingReadFile(filename, callback) { 
    // First check to see if there is already a batch 
    if (requestBatches.hasOwnProperty(filename)) { 
    requestBatches[filename].push(callback); 
    return; 
    } 

    // Otherwise start a new one and make a real request 
    var batch = requestBatches[filename] = [callback]; 
    FS.readFile(filename, onRealRead); 

    // Flush out the batch on complete 
    function onRealRead() { 
    delete requestBatches[filename]; 
    for (var i = 0, l = batch.length; i < l; i++) { 
     batch[i].apply(null, arguments); 
    } 
    } 
} 

// Request the same resource 10,000 times at once 
for (var i = 0; i < 10000; i++) { 
    batchingReadFile(__filename, onRead); 
} 

function onRead(err, file) { 
    if (err) throw err; 
} 

Как разработчик новичку узла есть одна вещь в этом примере я просто не понимаю, как переменная callbacks устанавливается на массив, содержащий только одну функцию обратного вызова (var callbacks = requestBatches[filename] = [callback];), тем не менее, как он может содержать 10000 обратного вызова функции в функции onRead?

Я понимаю, что функция onRead ставится в очереди событий и не вызывается, пока функция batchingReadFile не была названа все 10000 раз, но все-таки, как же закончатся другие функции обратного вызова в callbacks?

Я пропустил что-то очень очевидное? Если да, будьте осторожны и укажите на меня.

ответ

0

Возможно, вы пропустили код;

if (filename in requestBatches) { 
    requestBatches[filename].push(callback); 

    return; 
} 

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

К тому времени onRead функция выполняет , массив будет содержать 1000 функций обратного вызова.

+0

Да, они добавляются в переменную requestBatches, но это «обратные вызовы», которые используются в «onRead». –

0

Проблема для меня заключалась в том, что я пропустил/проигнорировал/забыл, что javascript использует указатели. Этот вопрос вернул меня на правильный путь: How does variable assignment work in JavaScript?

Смежные вопросы