Внедряване на Async и чакайте с генератори

Снимка на Блейк Connally в Unsplash

В наши дни можем да напишем нашия асинхронен код по синхронен начин благодарение на ключовите думи за async и чакащи. Това улеснява четенето и разбирането. Наскоро се зачудих как може да се постигне същия ефект, без да се използват тези ключови думи.

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

Напред, клонирайте хранилището и нека започнем.

Генератори

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

Генераторите са обекти, създадени от функции на генератора - функции със * (звездичка) до името им.

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

Разгледайте този пример:

const generator = (функция * () {
  // в очакване на .next ()
  const a = добив 5;
  // в очакване на .next ()
  console.log (а); // => 15
}) ();

console.log (generator.next ()); // => {done: false, стойност: 5}
console.log (generator.next (15)); // => {done: true, value: undefined}

Като се има предвид, че това са абсолютни основи, бих препоръчал, преди да превъртите по-нататък, да прочетете тази статия, за да разберете какво наистина се случва тук.

Ако почувствате, че сте добре разбрали основните идеи, можем да продължим.

Изчакайте, чакай малко

Никога ли не сте се чудили как действително чакането работи?

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

Това, което бихме могли да направим, е просто да вземем всяка добивна стойност, да я поставим в обещание и след това да изчакаме обещанието да бъде решено. След това просто го връщаме към генератора, като се обаждаме на generator.next (разрешенаValue).

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

Какво трябва да прави нашата функция asynq:

  • изчакайте асинхронен код, преди да продължите изпълнението
  • върнете обещание с върнатата стойност от функцията
  • накарайте опитайте / уловете работа върху асинхронен код

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

Добре, страхотно! Сега можем да говорим за изпълнението.

Нашата функция asynq приема като параметър генератор на функции - като го наричаме, ние създаваме генератор.

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

Тогава, рекурсивно, ние консумираме всяка ключова дума за доходност, като се обаждаме на generator.next (secureuredValue). Изчакваме върнатото обещание да бъде уредено и след това връщаме резултата си обратно към генератора, като повтаряме целия процес.

Трябва да прикачим и обработващия улов, така че, ако функцията хвърли изключение, можем да я хванем и да върнем изключението вътре във функцията, като извикаме generator.throw (грешка).

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

Когато генераторът е готов, връщаме обещаната възвръщаемост на генератора.

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

Обобщавайки

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

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

Благодаря ви много за четенето! Надявам се, че сте намерили тази статия за информативна. Надявам се също да ви помогна да видите, че няма магия, включена в асинхронизирането и чакащите ключови думи, и че те могат лесно да бъдат заменени с генератори.

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

Вижте моите социални медии!

Присъединете се към моя бюлетин!

Първоначално публикувано на www.mcieslar.com на 6 август 2018 г.