Както всички знаем от предишните публикации (вижте започващи със MEAN и MVC в MEAN), че Node е асинхронен език. Така че всички ваши операции като четене и запис на файл, четене и запис на база данни и т.н. са асинхронни. В случай, че искаме да ги изпълняваме синхронно, можем да използваме обратни извиквания или обещания или асинхронен пакет. Ще обясня всяко с пример.

Например имаме следната задача

  • Стъпка 1: Свържете се с база данни
  • Стъпка 2: вземете потребителски данни
  • Стъпка 3: филтрирайте по възраст

Сега в горната задача можете да изпълните стъпка 2 само след като стъпка 1 е направена и по същия начин за стъпка 3 трябва стъпка 2 да бъде изпълнена правилно.

На всеки друг език просто

openDatabase()
getData()
filterData()

ще работи правилно, но не и в случая на NodeJS. За да постигнем това, можем да направим това по 3 начина.

ОБРАТНО ПОВИЖДАНЕ

Когато функция просто приема друга функция като аргумент, тази съдържаща се функция е известна като функция за обратно извикване. Най-лесният пример е функцията за изчакване

setTimeout(function(){
console.log(“хей”)
}, 10)

setTimeout приема функция и цяло число като вход. Функциите за обратно извикване също могат да приемат аргументи.

Сега за нашата задача можем да извикаме следващата функция като част от функцията за обратно извикване от функцията например.

В горния пример извикваме функцията openDatabase(), която на свой ред извиква функцията обратно извикване, която приема връзката и извиква функцията getData(), която отново извиква друга функция за обратно извикване, която извиква функцията filterData().

Функцията за обратно извикване не се изпълнява, освен ако не бъде извикана от съдържащата я функция, тя се извиква обратно. Оттук и терминът функция за обратно извикване

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

ОБЕЩАНИЯ

Както подсказва името, това е обещание. Нещо като,

Обещавам да направя това, ако е вярно, иначе няма да го направя.

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

Обещанията имат 3 състояния

  • В очакване : Това е състоянието преди изпълнението на обещанието
  • Изпълнено: Ако обещанието беше вярно
  • Отхвърлено: Ако обещанието е невярно

С обещания, вместо асинхронно повикване, приемащо обратно извикване, вместо това връща обещание. След това извикващият код може да изчака, докато това обещание бъде изпълнено, преди да изпълни следващата стъпка.

Обещанието се връща с две ключови думи

  • resolve() : в случай че изпълнението на асинхронен код е било успешно
  • reject() : в случай че изпълнението на асинхронен код е неуспешно

Това се получава от извикващата функция отново чрез две ключови думи

  • then() : за получаване в случай, че изпълнението на кода е успешно
  • catch(): за улавяне на изключения в случай, че обещанието е отхвърлено.

Сега нашата примерна задача може да бъде изпълнена по този начин

Това прави кода по-лесен за четене. По същество обещанията също така вътрешно използват обратни извиквания.

Обещанията са асинхронни. Обещанията във функциите се поставят в опашка с микрозадачи и се изпълняват, когато завършат други синхронни операции.

АСИНХР

Async е пакет в Node. Това е полезно, когато трябва да извършите някои операции паралелно и някои последователно. Основният принцип зад async също е обратните извиквания, но това прави кода четим. Горният пример ще работи като

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

Също така помага в случай, когато трябва да изпълните комбинация от синхронна и асинхронна задача. Например, за да получите данни от 2 таблици в база данни.

В този случай бихме изпълнили openDatabase() и след това изпълнили функциите getUserData и getEventData успоредно като

ЗАКЛЮЧЕНИЕ

Разбирането на тези концепции за обратни извиквания, обещания и асинхронен пакет може да бъде объркващо, но видяхме, че те са от съществено значение за по-добро използване на Node и обработка на цикъл на събития в него.

Можете да използвате всеки и всичко във вашия код според сложността и търсенето на кода. Не бих предложил кой да използвате, бих ви позволил да проучите и да изберете този, който разбирате най-добре и отговаря на вашите изисквания.