2016-08-16 4 views
0

Я создаю небольшой скрипт, чтобы лучше понимать обратный вызов.Понимание обратных вызовов

Из приведенного ниже сценария поведение, которое я ожидал, было следующим: «http.get работает и занимает в среднем 200 мс. Приращение цикла« i »занимает в среднем 2500 мс. В 200 мс процесс должен выйти, а сценарий должен быть остановлен на работу. Почему печать все я? Если я понимаю это лучше, я думаю, я понимаю обратный вызов.

var http = require("http"); 
var starttime = new Date(); 

//Function with Callback 
for (var j =0; j<10; j++){ 
    http.get({host : 'nba.com'}, function(res){ 
     console.log("Time Taken = ", new Date() - starttime, 'ms'); 

     process.exit(); 
    }).on('error', function(er){ 
     console.log('Got Error :', er.message); 
    }) 
} 

//Loop that exceeds callback trigger time 
for(var i=1; i<10000; i++){ 
    console.log(i); 
} 

console.log("Time Taken = ", new Date() - starttime, 'ms'); 
+0

Цикл for является синхронным, а код в нем асинхронным. Он работает через цикл for, запуская вызов getynyn. Цикл for завершает работу до того, как активируются обратные вызовы. В Интернете есть много документов и образцов, чтобы проиллюстрировать работу async. – bryanmac

+0

Спасибо bryanmac. Я проверю их. Теперь это ясно, как облако. – PatrickJames

ответ

3

Javascript в node.js однопоточен и ввод/вывод событийный с использованием очереди событий. Таким образом, ваши асинхронные обратные вызовы, которые сигнализируют о завершении HTTP-запросов, не могут выполняться до тех пор, пока ваш исходный поток Javascript не завершится и не вернет управление обратно в систему, где он может затем вывести следующее событие из очереди событий для обслуживания завершения t он http-запрос.

Как таковой, цикл for будет завершен до того, как будут обработаны любые ответы HTTP.

Вот шаг за шагом процесс:

  1. Ваш первый for запускает цикл и посылает 10 запросов HTTP.
  2. Эти HTTP-запросы выполняются в фоновом режиме с использованием асинхронной сети. Когда один из них завершается и имеет ответ, модуль http помещает событие в очередь событий Javascript, и это будет задачей интерпретатора JS, чтобы вытащить это событие из очереди событий, когда оно будет завершено другими его действиями.
  3. Ваш второй цикл for завершается, и все значения i выводятся на консоль.
  4. Ваш скрипт заканчивается.
  5. Затем интерпретатор JS проверяет очередь событий, чтобы увидеть, есть ли ожидающие события события. В этом случае будут случаи HTTP-ответа. JS-интерпретатор вытаскивает самое старое событие из очереди событий и вызывает связанный с ним обратный вызов.
  6. Когда этот обратный вызов завершается, следующее событие вытягивается из очереди событий, и процесс продолжается до тех пор, пока очередь событий не будет пуста.
  7. Если какой-либо из ваших обратных вызовов вызывает process.exit(), тогда это замыкает оставшиеся обратные вызовы и немедленно завершает процесс.

В то время как этот другой ответ был написано для браузера, управляемых события, однопоточная концепция такого же, как в node.js так это другой ответ может объяснить еще несколько вещей для вас: How does JavaScript handle AJAX responses in the background?

+0

Спасибо Jfiend00. Это ясно объясняет это. То, что я забыл для сети или ввода-вывода, является асинхронным, а CPU синхронизируется из-за одиночной резьбы. Для цикла связан процессор и нет ввода-вывода. Имеет смысл. – PatrickJames

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