Рубрики
Без рубрики

Обещания и покемон – как я научился думать о асинх

Kalalau Cantrell обещает и покемон – как я научился думать о асинкопообоях. Image Credit: Lee Mckusick. Если вы изучали JavaScript, вы, возможно, слышали об обещаниях и насколько они потрясающие. Итак, вы решили исследовать основы. Возможно, вы столкнулись по доскам MDN на обещаниях

Калалау Cantrell

Если вы изучали JavaScript, вы, возможно, слышали об обещаниях и насколько они потрясающие.

Итак, вы решили исследовать основы. Возможно, вы наткнулись на Документы MDN на обещаниях или отличные статьи, такие как этот Эриком Эллиотт или этот Брэндон Морелли. Если вы прочитали все эти и более, вы, наверное, видели идущий пример обещаний в действии.

Однако, как только вы видели достаточно этих типов примеров, вы начинаете задаваться вопросом, на самом деле вы хватаете обещаниям. На данный момент, если вы похожи на меня, вы концептуально понимаете, что делает их потрясающим – они позволяют вам писать асинхронный код в синхронном рисунке – но вы хотите увидеть пример того, что они могут сделать, кроме последовательности серии console.log этот огонь в разное время.

Итак, что я сделал? Я построил простую игру Pokemon, показывая поворотную битву против Electabuzz Отказ

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

Основные функциональные возможности

Electabuzz и игрок каждый начинают с определенного количества точек хит (HP). Первое, что происходит, это отбрасывает атаки и игрока теряет какой-то HP. Тогда игра ждет Пока игрок не решит атаку использовать против Electabuzz.

Да, игра просто ждет … и ждет … Это часть, где я действительно начал ценить ценность использования обещаний. Как только игрок выбирает атаку, Electabuzz теряет какой-то HP, а затем он снова атакует. Этот цикл продолжает до тех пор, пока HP или HP ILECALABUZZ не достигнет нуля.

Псевдокод

До настоящего времени до сих пор. Теперь давайте немного настроим так, чтобы отбрасывать атакует более естественное время. Я хотел, чтобы это казалось, что он «думал» о его ходу, прежде чем сделать это.

В то время как мы на этом, давайте посыпьте немного обещания, чтобы мы могли цепи о функциях, которые будут стрелять после того, как вы поправляетесь, когда-то отбрасывает атакующий, а не миллисекунд. Это постоянная игра в конце концов.

Отлично, эта настройка позже позволит нам сделать это.

Теперь, на код для игрока.

Как мы пишем функцию, когда вызывается, будет ждать ввода пользователя перед завершением его выполнения? Мы знаем, что нужно привлекать Слушатель событий как-то для пользовательской входной части. Мы также знаем, что мы должны быть в состоянии использовать обещания Как-то для асинхронной части … Но как поставить два вместе?

Это то, что если вы 1) создаете обещание, а 2) в этом обещании добавить слушатель событий в наше дело, событие Click кнопки и 3), если функция, вызываемая слушателем события, решает Обещание, вы можете достичь этого эффекта ожидания.

Вуаля! Теперь мы можем сделать это.

Обратите внимание, что каждый звонок в Playerturn () В вышеупомянутой выше просто подождите … и подождите … пока игрок не решит атаковать. Только тогда исполнение будет продолжено отбрасывать очередь, а затем обратно.

Но зачем писать это, когда тот же код может быть написан в своей эквивалентной форме Async/ждут, что выглядит так намного приятнее? Если вы смогли следовать тому, что мы сделали с обещаниями до этого момента, это не слишком много скачка, чтобы увидеть, как работает Async/ждут. Сравните следующий код с вышеуказанным, и вы увидите, что они эквивалентны, но приведенный ниже код легче рассуждать.

Возьми более глубокое погружение в Async/жду, проверяя Эта статья Tiago Lopes Ferreira или Эти слайды WES BOS.

Итак, теперь наш код способен уволить несколько раундов по очереди боевой борьбы с Electabzzz. Но нам нужен путь для игры.

Наконец, мы хотели бы, чтобы игра продолжала работать самостоятельно, пока не будут выполнены условия игры. Вместо того, чтобы вручную повторять CUPURNURN () и Playerturn () Логика, как мы делаем, мы можем рекурсивно позвонить наше GameLoop () функция.

Теперь GameLoop Будут работать и продолжать звонить себе и продолжать работать, пока либо electabuzz не требует нашего HP до нуля, либо мы берем его на ноль. Если вы хотите узнать больше о рекурсии, смотреть Это YouTube видео MPJ. Пока вы на этом, проверьте другие видео на Fun Fun Fun Fun Fun. Он отлично объясняет комплексные темы.

Давайте посмотрим на псевдокод в полном объеме:

Код

Теперь, когда мы через псевдокод, вот ручка, показывающая, как я реализовал эту логику с фактическим JavaScript:

Заключение

Спасибо за прочтение. Этот маленький эксперимент с обещаниями показал мне, что есть много, что обещает упростить, когда дело доходит до сочинения асинхронного кода. Хотя типичные обещания пример с Console.logs и Settimeouts проиллюстрировали концепцию, она просто не волнула меня, поэтому я решил создать эту простую игру, чтобы заставить меня пополнить обещания. Я надеюсь, что вы подняли некоторые из этого волнения. Если есть какие-либо эксперты Async, прочитав это, это было бы здорово услышать от вас о лучших способах достижения той же функциональности (например, с генераторами). Если ничего неясно никому, дайте мне знать И я постараюсь уточнить.

Пожалуйста, не стесняйтесь говорить привет Твиттер .

Оригинал: “https://www.freecodecamp.org/news/promises-and-pokemon-how-i-learned-to-think-in-async-2ec098c2c90d/”