Обратни повиквания VS Обещава VS Async / Очаквайте

Докато превъртате през обявените говорители за тази седмица среща с BerlinJS, забелязах, че Мохамед Оун ще проведе първия си разговор (късмет между другото) на последния голям хит на JS в света, Async и чакайте. Затова реших, че и аз мога да направя собствено обобщение, за да мога да сравня бележките;)

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

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

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

Нека направим това → Настройката

Нека си представим, че имаме приложение node.js, което е в състояние да публикува данни от формуляр до контролер, което чрез мангуста (включително малко междинен софтуер) се съхранява в нашата БД.

Този сценарий ни дава няколко варианта, добре три:

Обратни повиквания

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

Ние наричаме functionA и изпълнението на всички последващи функции стават зависими от връщането на functionA.

Сега проблемът с това започва да се появява, когато имаме по-сложни функции. Може би трябва да дезинфекцирате данните си или да стартирате валидиране или да изградите асоциации с други записи в БД. Бързо пристигате и стигате до това, което мнозина наричат ​​адски обратно повикване.

Започваме да гнездим обратни повиквания и нещата бързо стават трудни за четене.

обещания

Обещанието е обект, представляващ евентуалното приключване или неуспех на асинхронна операция.

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

Да речем, че искаме да намерим друг запис и да изградим асоциация, преди да запишем, знаем как би могло да изглежда това в света на обратните извиквания, но с обещания в крайна сметка с верига, донякъде подобна на тази:

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

Асинхронен / очакват

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

Той е елегантен и прост, но според мен единственият компромис е как да се справим с грешките. Редовните обещания ни предоставят приятен и лесен блок за улавяне, който опростява справянето с изключения и грешки, докато функциите на async наистина нямат приятен начин да уловя грешки, доколкото знам. Така че трябва да направите нещо подобно.

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

И там го имате

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

Отбелязахте ли грешка? Говоря ли глупости?

Кажете ми, ако мислите, че съм сгрешил края на пръчката! Аз съм човек, правя грешки, щастлив съм да уча от тях :)

Източници:

В момента гледам как Уес Бос говори по Async + Очаквайте и не мога да го препоръчам достатъчно, ако искате да знаете повече (той описва обработката на грешки толкова много по-подробно, сериозно е страхотно). Всъщност бих препоръчал просто да го последвам (аз съм голям фен Уес Бос!).

MDN уеб документи за използване на обещания

MDB уеб документи на async + чакат