У меня есть следующий блок кода: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
, но безрезультатно. Почему это происходит? Как это исправить?
* Где * Доступ к 'groups.data'? Пожалуйста, укажите соответствующий код. И как выглядит «результат», всегда ли 'module.rpc' возвращает данные? – Bergi
Я мог бы, но этот код содержит функции, которые мне тогда нужно будет объяснить. Однако, если я помещаю инструкцию 'console.log (result);' в конечную функцию, то 1-строчная сводка объекта (в Chrome Console) говорит, что в массиве есть 2 объекта, но когда я его расширяю, он показывает 3. Если я специально попробую 'console.log (result [1]);', то он говорит 'undefined', соответствующий вышеуказанным ошибкам. –
Хм, похоже, что ваш 'async.parallel' не удался. – Bergi