2015-11-29 3 views
1

Код ниже - это код узлаJS. Я новичок в nodeJS, и я довольно запутался в потоке кода в nodejs, так как он сообщает, что nodejs однопоточный, а с другой стороны он также сообщает нам, что обратные вызовы и IO являются асинхронными, если я не ошибаюсь. Может ли кто-нибудь дать мне фактическое значение обратных вызовов и как работает код. Разве это так, что асинхронная функция, которую мы вызываем как обратные вызовы, выполняется каким-то другим потоком/процессом, а не потоком single nodejs (PS - это концепция, которую я понял ... я могу ошибаться), то почему мы r callng nodejs как однопоточная программа.Не удается понять основную логику в NodeJS

function placeOrder(orderNo) { 


    setTimeout(function() { 
    deliver(orderNo); 
}, 5000); 
    console.log("Order is: " + orderNo); 

} 

function deliver(orderNo) { 
    console.log("Item is delivered with Order No.- " + orderNo); 
} 

placeOrder(1); 
placeOrder(2); 
placeOrder(3); 
placeOrder(4); 
placeOrder(5); 
placeOrder(6); 
+1

http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+1

Вы посмотрели http://stackoverflow.com/questions/21607692/understanding-the-event- цикл? RQ = 1? –

+0

Эта ссылка ответила на все мои вопросы .... thnx – Neil

ответ

1

Nodejs однопоточный. Существует цикл событий, который работает непрерывно и выполняет любые инструкции, которые он должен выполнить. Таким образом, в основном, когда вы используете функцию setTimeout с интервалом в 5 секунд, она поместит некоторый код, который будет выполняться циклом события через 5 секунд. Конечно, если цикл событий занят выполнением какого-либо другого кода в это время, он отложит выполнение вашего кода для более позднего этапа. Таким образом, он может не выполняться через 5 секунд, а через 5,1 секунды.

Итак, когда вы вызываете setTimeout(function() { ... }, 5000);, вы планируете код javascript для выполнения не менее 5 секунд спустя циклом события.

1

Асинхронный не является многопоточным. В приведенном выше случае вы запрашиваете асинхронные обратные вызовы, но ваш единственный поток прослушивает эти обратные вызовы, когда он не запускает ваш другой код. Обратные вызовы возвращаются в тот же поток, который их запрашивал.

Вы не получите двух функций deliver, работающих в то же время из-за этого. Если вы sleep внутри deliver, другие обратные вызовы должны будут подождать. Вот почему в однопоточных средах, как это, важно быстро выполнить работу и вернуться (в браузер или на узел), чтобы цикл событий мог возобновить прослушивание большего количества обратных вызовов в одном потоке.

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