2013-02-09 4 views
2

У меня есть следующий блок кода:Javascript Async.js Parallel не работает с Socket.io

async.parallel([ 
    function(cb){ module.rpc("user.data",{"username":data.username},cb); }, 
    function(cb){ module.rpc("group.list",{"username":data.username},cb); }, 
    function(cb){ module.rpc("set.list",{},cb); } 
],function(error,result){ 
    if(error){ callback(error); return; } 
    var user = result[0], groups = result[1], sets = result[2]; 
    callback(null,template.render({"user":user,"groups":groups,"sets":sets})); 
}); 

module.rpc это функция, которая извлекает необходимые данные с сервера через socket.io. Теперь конечная функция (второй аргумент async.parallel) должна вызываться только после того, как эти три функции перезвонили. Однако, во время рендеринга шаблона (EJS), когда я пытаюсь получить доступ к groups.data, я иногда получаю ошибку:

Uncaught TypeError: Cannot read property 'data' of undefined 

код кажется прекрасно для меня, но работает только изредка. Я неоднократно перезагружал страницу, не изменяя базовый код, и имел коэффициент успеха около 20%. Я совершенно не понимаю, почему здесь все происходит неправильно. Все, что я могу догадаться, это то, что назначение этой переменной задерживается. И поэтому я попытался отложить рендеринг с помощью window.setTimeout, но безрезультатно. Почему это происходит? Как это исправить?

+0

* Где * Доступ к 'groups.data'? Пожалуйста, укажите соответствующий код. И как выглядит «результат», всегда ли 'module.rpc' возвращает данные? – Bergi

+0

Я мог бы, но этот код содержит функции, которые мне тогда нужно будет объяснить. Однако, если я помещаю инструкцию 'console.log (result);' в конечную функцию, то 1-строчная сводка объекта (в Chrome Console) говорит, что в массиве есть 2 объекта, но когда я его расширяю, он показывает 3. Если я специально попробую 'console.log (result [1]);', то он говорит 'undefined', соответствующий вышеуказанным ошибкам. –

+0

Хм, похоже, что ваш 'async.parallel' не удался. – Bergi

ответ

2

socket.io постоянно отправляет события на сервер, пока не получит подтверждение. В зависимости от нагрузки на сервер подтверждения могут быть неактуальными. Так было отправлено несколько одинаковых запросов, и поскольку async.parallel использует счетчик вместо индивидуального отслеживания каждой функции, окончательная функция вызывалась преждевременно.

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