2014-10-09 2 views
0

У меня нет большого опыта работы с Javascript и я после Node.js книги и в нем есть следующий кодКак работает это закрытие?

function start(route, handle) 
{ 
    function onRequest(request, response) 
    { 
     var postdata=''; 
     var pathname=url.parse(request.url).pathname; 

     request.setEncoding('utf8'); 

     request.addListener("data", function(postDataChunkd) 
     { 
     postdata+=postDataChunkd; 
     }); 

     console.log('Post data: ' + postdata);// <----------------------- HERE 

     request.addListener("end", function() 
     { 
     route(handle, pathname, response, postdata); 

     }); 
} 

http.createServer(onRequest).listen(8124); 

console.log('Server running on 8124'); 
} 

exports.start=start; 

код работает, как ожидалось, однако дело в том, что для меня это кажется бит, неясный, что переменная postData регистрируется как пустая строка в середине addListener («данные» ... и addListener («конец» ...

Может ли кто-нибудь объяснить, почему переменная postData регистрируется пустым, несмотря на успешную запросить?

С уважением

Dan

+0

Первый порядок ведения бизнеса при использовании NodeJS - это знакомство с концепцией асинхронного программирования. Вы добавляете слушателя к событию 'data', и ясно, что это событие еще не произошло, когда запускается' console.log() '. –

+0

... введите регистрацию * внутри * обработчиков событий, и вы получите существенный результат. –

+0

Определенно я обращу больше внимания на асинхронную сторону. Спасибо – user3256539

ответ

2

Может кто-нибудь объяснить, почему переменная PostData регистрируется пустой, несмотря на успешный запрос?

На самом деле это не имеет ничего общего с закрытием, просто отсчет времени. С момента его регистрации запрос еще не завершил (или даже получил один обратный вызов "data"), поэтому переменная не имеет ничего привязанного к нему. Запрос завершает асинхронно.

Вот порядок, в котором вещи в этом onRequest обратного вызова происходит:

  1. Переменные postdata и pathname созданы.

  2. postdata установлен на ''.

  3. pathname установлен на основании оценки url.parse(request.url).pathname.

  4. request.setEncoding называется.

  5. Создана функция, передаваемая в первый вызов request.addListener.

  6. request.addListener вызывается и передается строка "data" и функция, созданная на последнем шаге. Функция не выполнена в это время.

  7. Выражение 'Post data: ' + postdata оценивается, получая 'Post data: ' (как это postdata'') и передается в console.log быть написаны на консоль.

  8. Создана функция, переданная во второй вызов request.addListener.

  9. request.addListener вызывается с "end" и функцией, созданной на последнем шаге.

  10. Спустя некоторое время может быть или не быть один или несколько вызовов функции creaetd на шаге 6.

  11. Через некоторое время, вероятно, будет один вызов функции, созданной на шаге 8.

+1

Большое спасибо! Теперь это очень ясно! – user3256539

0

Node.js не ждать, пока функция добавления слушателя, чтобы закончить. Узел запустит асинхронную функцию, а затем перейдет к следующей строке кода. Во время выполнения postdata = ''.

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