2013-10-04 2 views
0

Я получил этот комментарий:Node.js: как обрабатывать входящие данные?

На стороне сервера Node.js при обработке входящих данных, если вы хотите использовать for петли, вы должны создать i внутри анонимную функцию или вы будете тянуть ваши волосы интересно, как черт возьми, ваша переменная i больше, чем вы ограничиваете ее внутри своей петли.

Вот в устранении ошибки, что было рекомендовано:

var i = 0, 
len = that.users.length; 

(function(i) { 
    while(i < len) { 
    console.log(' - - - - - debug - - - - -'); 
    console.log('i = ' + i); 
    i++; 
    } 
})(i); 

Может кто-нибудь объяснить мне, почему использование анонимной функции необходимо?

ответ

1

Проблема возникает только при наличии асинхронного кода внутри цикла. Например (я изменил для цикла для простоты):

var i = 0, 
len = that.users.length; 

for(i = 0;i < len;i++) { 
    setTimeout(function() { 
    console.log('i = ' + i); 
    }, 500); 
} 

Вы увидите, что работает этот код вызывает значение len для печати len раз, вместо того, чтобы сосчитать до len. Это связано с тем, что цикл for заканчивается перед выполнением любого из операторов печати, поэтому цикл вышел из-за того, что i == len.

Исправлением для этого является блокировка i в каждое значение с немедленно вызываемым Function Expression (IIFE):

var i = 0, 
len = that.users.length; 

for(i = 0;i < len;i++) { 
    (function(i) { 
    setTimeout(function() { 
     console.log('i = ' + i); 
    }, 500); 
    })(i); 
} 

Это не совсем багфикса вы представили, но это ближе я может думать, что имеет смысл. Учитывая больше контекста, я мог бы быть более уверенным в том, какую проблему он должен решить.

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