Автор оригинала: FreeCodeCamp Community Member.
Кевином Кононенко
Обещания могут показаться запутанными … пока не окажетесь в «обратном спине». Тогда они кажутся разумными!
Мы все любим асинхронные возможности JavaScript. На самом деле мы любим их так сильно, что иногда мы переимены. И тогда мы получаем код, который выглядит так, чтобы « Pyramid из DOOM », на котором вы хотите ответить, бросая Hadouken:
Это обычно известно как «обратный ад», потому что вы, вероятно, не хотите перечитать этот код и попытаться понять, как все работает, и в какой последовательности это работает. На самом деле, никто в вашей команде тоже не делает.
Вот еще один, более простой пример:
Несколько вещей трудно из приведенного выше примера:
- Неясно обработанию ошибок. Что произойдет, если что-то пойдет не так?
- Каждая функция зависит от предыдущей функции. Вам не нужен асинхронный стиль. Вы хотите сделать заказ читать другим, читая код. Когда вы цепите это много функций вместе, синхронный стиль кода будет более читаемым.
- Вам необходимо постоянно отслеживать переменные для ввода в функцию, а затем выводить. А также отслеживать логику, которая происходит с каждым выходом. Это становится утомительным.
Вы можете сделать весь этот процесс более понятным, используя Обещания Отказ Если вы подобны мне, вы, возможно, слышали об обещаниях один или два раза, но затем игнорировали их, потому что они казались запутанными. Основное использование обещаний на самом деле довольно легко, если вы понимаете обратные вызовы.
Обещания любят ходить в казино, и если вы хотите очистить неприятный код код, они являются отличным решением. Обещания поощряют простые, однозначные функции, которые позволят вам написать четкий код и понять каждый шаг без головных болей.
Примечание. Если у вас нет опыта работы с обратными вызовами, проверьте Мое объяснение по принципам обратных вызовов. Если вы ищете более техническое объяснение обещаний, проверить Это руководство или Это руководство или Это видео Отказ
Пусть ставки начинаются!
Обещание проводит место ценности, которое еще не существует, но, безусловно, будет существовать в будущем. Это позволяет четко выполнять функцию и понять его начало и конец. Как показано выше, обещания являются отличным способом прояснения последовательных асинхронных функций и уточнения входов и выходов.
Допустим, вы принимаете выходные каникулы в казино. У вас есть две недели зарплаты в вашем кармане, и вы собираетесь наслаждаться каждым моментом, когда вы делаете пари, до последнего дима. Вы получаете свой гостиничный номер, затем отправляйтесь в казино. Однако таблицы в казино не принимают наличные деньги. Вам нужно отправиться на кассирную станцию, чтобы обменять свои деньги (скажем, $ 1000) для токенов казино, как эти ребята:
Остановиться прямо здесь. Это начало обещания! У вас есть известное значение для начала, но это выделение, а не конечный продукт. Вы не можете потратить эти жетоны казино за пределами пола казино, и вы не пришли в казино, чтобы собрать токены казино. Вы отправлялись туда, чтобы играть в игры, и токены казино являются отправной точкой, которая позволит вам перевести наличные деньги в $ 1000 в конечный продукт, надеюсь, что более 1000 долларов.
После того, как вы получите токены, вы попробуйте все свои любимые игры. Вы играете в 20 руках блэкджека, ставите на 30% своих денег и потерять 200 долларов. Это было быстро. Вы движетесь на рулетку и ставят на 5% на черном, пока не выиграете 50 долларов. Вы переходите к Poker, ставите 50% своих денег, затем потеряйте 500 долларов после того, как вы получите слишком уверенно.
Вот тот процесс в коде:
Пара вещей, чтобы отметить об этом сценарии:
- Вы не можете играть в две таблицы одновременно, поэтому одна игра должна следовать за другой.
- Не так много вы можете сделать в казино, кроме воспроизведения игр, поэтому вы хотите перейти прямо из одной игры в другую.
- Единственный актуальный вход, когда вы запускаете определенную игру, – это количество токенов, которые вы можете использовать для ставки.
- Выход из конкретной игры также будет жетоны.
- Если у вас закончится токены, вы не сможете начать другую игру. Вы можете также пожаловаться в менеджеру в этот момент и попытаться получить их симпатию, либо (скорее) начать пить.
Каждый из трех .then () заявлений в вышеуказанной последовательности – это обещание Отказ Он начинается с окончательной стоимости стенды, и вернет неизвестное количество токенов в зависимости от того, как идет игра. После того, как игра заканчивается, она возвращает значение и немедленно кормит его следующим обещанием. Предыдущее обещание считается «выполненным».
Вот вышеуказанный пример, в расширенном виде:
В этом примере все функции многоразовые! Поэтому, если вы хотите играть в игры в другом порядке, вы можете легко переключить их в строки 4-6.
Для сравнения, вот тот же код без обещаний:
Довольно сложно читать! Кроме того, сообщения об ошибках повторяются. Вы можете бросить эту ошибку, если обещание отклоняется из-за значения, меньше или равно 0 $. Асинхронный стиль не нужен, потому что мы знаем, что это последовательность последовательных действий.
Удвоение вниз по этим примерам
Если вы понимаете обещания в этот момент, я чертовски поражен! Давайте копаем глубже в первый пример, чтобы сломать его вниз по линии.
Строка 3: Вы преобразуете свои деньги на $ 1000 в токены, используя функцию getCasinotokens (), не изображенные здесь.
Строка 4: Заявление .then () означает, что следующий код код будет использовать результаты функции getCasinotokens (). Эти результаты будут переданы через токены аргумент Этот сегмент, выровненный 4-6, теперь Недоставленное обещание Отказ Мы взяли в себя токены Значение, и мы ждем, чтобы преобразовать это значение, прежде чем мы сможем двигаться дальше. Оператор возврата выполнит его.
Линия 5: Мы называем функцию PlayBlackjackjack () с 30% токенов. Поскольку блэкджек можно играть только с токенами, важно, чтобы этот аргумент в форме числа. Если это была строка или массив или объект, эта функция бросила ошибку, и мы отказываемся от обещания. Когда обещание отклоняется, мы движемся к функции .catch () в строке 13, чтобы увидеть, что будет делать, если ошибка возникает. К счастью, токены – это число, функция отделка, и это обещание выполняется. Мы вводим одну сумму токена, сделали несколько ставок и вышел с новой суммой токена
Линия 7: Есть еще другая функция. Входное значение для этого обещания – это Результат оператора возврата из предыдущей функции. В этом случае это токен рассчитывает после игры в блэкджек. Это подается в обещание через Моретокенс аргумент Если вы были в казино, вы бы взяли вашу полученную кучу токенов и переместились непосредственно на следующую игру, рулетку.
Строка 8: Если функция Playroulette () успешно завершена, это обещание будет выполнено. В этом случае до тех пор, пока MoreTokens – это число, он успешно завершится. И тогда мы повторяем этот процесс для каждых последовательных функций.
Строка 13: Функция Catch () обрабатывает любые ошибки, поэтому нам не нужно делать обработку ошибок в каждой функции или пренебрегать обработкой ошибок.
Ключ к обещаниям – это концепция невыполненного, выполненного или отклоненного. После того, как вы создаете последовательность этих обещаний, у вас есть четкий поток входов и выходов и очистить код для других для чтения. Вы можете использовать 3 разных состояния для отслеживания прогресса всей цепочки обещаний. Стиль синхронный (последовательный), хотя фактическое исполнение асинхронно.
Спасибо за чтение. Я надеюсь, что эта аналогия помогла вам лучше понять JavaScript и обещания.
Нажмите? Ниже так другие люди увидят эту статью здесь на среднем.