Асинхронната природа на nodejs понякога е трудна за разбиране. Ключовото е, че Nodejs не чака, докато се наложи.
Нека обясня какво означава това,

  1. Nodejs не чака, когато програмата се изпълни, nodejs няма да изчака завършването на която и да е неблокираща операция. Неблокиращите операции са I/O операции, четене на файл, операционна система, потребителски вход от конзолата, http заявка и т.н. Сега възниква въпросът, ако nodejs не чака тези операции, тогава как се изпълняват тези операции?
    Тук идват Event и Callback, които са ядрото на nodejs архитектурата и това е, което я отличава от другите езици за програмиране.
    И така, това, което се случва, е, когато започнем програмата nodejs цялата програма се изпълнява наведнъж. Слушателите на събития са зададени, като слушане на http заявка на определен порт или слушане на въвеждане от потребителя. Забележете, че ако няма слушатели програмата ще излезе. Сега Event Loop влиза в картината, той действа като мост между събитията и обратното извикване. Цикълът на събитията ще изпълни обратното извикване, свързано със събитието, всеки път, когато се задейства събитие. Така че има една нишка, която слуша за всички събития и изпълнява тяхното обратно извикване. Събитието може да използва други нишки за тяхната цел, но обратното извикване, свързано с тях, ще бъде изпълнено в основната програма.
  2. Докато не се наложи, това се отнася за интензивни операции на процесора. Ако извършим интензивно CPU изчисление във всяко обратно извикване, процесът ще блокира и производителността ще пострада, тъй като другото обратно извикване (без блокиращ код) трябва да изчака изпълнението на блокиращото обратно извикване. Ето защо трябва да се внимава изключително много, за да не се блокира цикълът на събитията.

Пример: C++ срещу nodejs

Тук взех същия пример, за да покажа как nodejs и другите езици за програмиране са различни.

C++ пример

Програмата изисква въвеждане от потребителя и прекратява само когато въведеното от потребителя е по-голямо от 100. Програмата ще изчака потребителят да въведе число, по-голямо от 100, след което ще продължи с по-нататъшно изпълнение.

Пример за Nodejs

Сега същият пример в nodejs

Nodejs версията на същото изглежда плашещо в началото. process.stdin и process.stdout се използват за взаимодействие с конзолата от nodejs.

readline.createInterface() се използва за създаване на екземпляр на readline чрез конфигуриране на потоци за четене и за запис. Входният ключ приема четим поток като process.stdin или fs.createReadStream(‘file.txt’), а изходният ключ приема записваем поток като process.stdout или process.stderr.

rl е екземплярът на readline.createInterface(), който слуша за събитието 'line', което се излъчва всеки път, когато входният поток получи вход в края на реда. Той също така слуша за събитие 'close', което изпълнява обратното извикване и прекратява програмата.

Първата разлика, която виждаме, е позицията на подкана „Въведете повече от 100?“ е в края, тъй като изпълнението не е линейно. Слушателите на събития са настроени и програмата ще стигне до края и няма да се прекрати, тъй като има чакащ слушател на събития.
Освен това, важно нещо, което трябва да видите тук е, че програмата не чака потребителят да въведе вместо това той реагира на събитието за въвеждане от потребителя с указаното обратно извикване. Следователно, докато програмата слуша за въвеждане на потребителя, ще видим обратното извикване в setInterval също да се задейства на всеки 3 секунди със съобщението „Извинете ме за намесата“.

Заключение

Надявам се, че мога да подобря вашето разбиране за това как работи програмата async nodejs в сравнение с традиционния начин. Благодаря ви, че прочетохте.