Предупреждение
Не устанавливайте этот пакет как зависимость! (См.: Начало работы)
В настоящее время обещания являются де-факто способа обработки асинхронных задач в JavaScript, и из-за этого они являются фундаментальной частью знаний любого разработчика JavaScript.
Однако, когда мы впервые обучаемся, мы учимся только достаточно , то есть мы немного узнаем, как использовать обещания (в настоящее время, скорее всего, с async/await только), Promise.all . Все метод и все.
Хотя этот подход имеет смысл для начинающих, потому что этого достаточно, чтобы решить большинство проблем в своей повседневной жизни, повторяющаяся проблема заключается в том, что они останавливаются на этом , то есть они никогда не проходят эти первоначальные знания.
И именно это «учиться достаточно, чтобы обойтись», которая держит многих разработчиков на их текущем уровне, поскольку решение более сложных проблем требует более глубокого понимания.
Таким образом, если вы хотите поднять свои навыки разработчика на следующий уровень , плавание на мелководье не будет сокращать его , вы должны идти глубже , вам нужно полностью понять обещания, и как они работают, вы должны быть опытными как в async/await так и then/catch стили обработки обещаний, и быть в состоянии организовать асинхронные Tassks самым эффективным способом.
Кроме того, поскольку обещания в конечном итоге являются абстракцией для выполнения асинхронных задач, возможность решать общие проблемы, связанные с асинхронным программированием, является обязательной.
Имея это в виду, мы создали этот проект точно, чтобы помочь вам сделать это глубокое погружение в обещания и асинхронное программирование.
Предоставляя как объяснения, так и практические упражнения, связанные с этими темами, этот проект направлен на то, чтобы стать вашим компаньоном в этом путешествии, чтобы овладеть ими.
Даже если вы уже опытный разработчик, вы можете выучить что -то или две вещи, например, например, вы можете попробовать решить concrete/parallelMaxConcurrency , concrete/concurrencyOverride , concrete/extractingResolvers и /foundation/promise поскольку они представляют некоторые интересные проблемы.
Важный
Этот проект не предназначен для людей, которые обещают обещания в первый раз, так как предполагается, что у вас есть хотя бы некоторые базовые знания обещаний, что они представляют и как использовать их как с async/await а then/catch .
Предупреждение
Внимание: это репо не предназначен для клонирования, если вы не внесете свой вклад, если вы являетесь конечным пользователем, пожалуйста, следуйте инструкциям ниже
Во -первых, чтобы установить проект, запустить:
npm create promises-training@latestПримечание
Этот проект управляется физическими упражнениями, поэтому основная цель-решить их.
Иногда будут объяснения наряду с упражнениями, которые помогут вам понять, что нужно сделать, а также некоторый контекст о решении проблемы.
Упражнения разделены на три категории:
Важный
Нет определенного порядка на категории, вы можете начать с любого из них и переключиться на другой еще до того, как полностью завершить другой. Тем не менее, упражнения имеют разные уровни, которые будут обсуждаться дальше.
Упражнения расположены в папках src/exercises/<category> , где <category> является одной из категорий, упомянутых выше.
Для графических упражнений базовые объяснения расположены в этом Readme, в разделе графика, и для каждого упражнения есть graph.png . PNG, который отображает график зависимости для этого конкретного упражнения.
Для бетонных и фундаментальных упражнений объяснения расположены в README.md в папке упражнения (например src/exercises/concrete/parallelChunks/README.md ).
Чтобы решить упражнение, вам необходимо отредактировать файл src/exercises/<category>/<exercise>/exercise.ts .
После решения упражнения вы можете проверить свое решение, запустив:
npm run check < category > / < exercise > Тесты расположены в src/tests .
Как правило, вы будете работать только в папке упражнений, так как тесты разработаны таким образом, чтобы они точно сказали вам, что пошло не так, без необходимости смотреть на их реализацию, но если по какой -либо причине вы застряли или любопытно, вы можете заглянуть на них.
Папка src/lib предназначена только для внутреннего использования, так что не беспокойтесь об этом.
Кроме того, чтобы поддерживать совместимость вашей установки с будущими версиями, не изменяйте какой -либо файл за пределами папки src/exercises .
Помимо категорий, упражнения также разделены на уровни, где упражнения увеличиваются в сложности по мере продвижения по уровням.
Есть три уровня:
Имейте в виду, что эта классификация несколько субъективна, поэтому YMMV, а также вам не обязательно нужно выполнять все упражнения на уровне, чтобы перейти к следующему.
Примечание
Как вы можете видеть, в настоящее время не так много продвинутых упражнений, но идея состоит в том, что новые упражнения будут добавлены с течением времени.
Каждое упражнение сопровождается автоматическими тестами, чтобы вы могли проверить свое решение.
Чтобы запустить тесты одного упражнения, запустите:
npm run check < category > / < exercise > Например, чтобы запустить тесты для упражнения parallelChunks , запустите:
npm run check concrete/parallelChunksИли, чтобы запустить графическое упражнение № 2, запустите:
npm run check graph/2/test.test.tsПримечание
В предыдущем примере нам нужно было добавить /test.test.ts в файл упражнения, в противном случае он также будет работать для других графических упражнений, начиная с 2 , например: упражнения от 2 до 29.
Мы используем Vitest в качестве тестового бегуна, поэтому доступны все его варианты CLI.
Кроме того, важно упомянуть, что графические упражнения имеют некоторые особенности, в том смысле, что они генерируются автоматически из самого графика , и из -за этого у некоторых упражнений есть огромное количество тестов (некоторые упражнения имеют более 100 тысяч тестов).
Конечно, мы не запускаем их всех, так как это было бы чрезвычайно медленным, поэтому мы запускаем только их подмножество, и можно настроить количество выполненных тестов , а также подмножество .
Вы можете прочитать больше в разделе «Упражнения на графиках».
В настоящее время есть три категории упражнений:
Большая часть борьбы с асинхронными задачами - организовать их так, что каждая задача начинается как можно скорее, и для правильного организации этих задач нам необходимо понять отношения между ними.
В этой категории вам будет представлен график зависимости в каждом упражнении, а затем вы организуете задачи на графике наиболее эффективным способом.
Поскольку упражнение сосредоточено на самой оркестровке, задачи создаются путем вызова createPromise(label) , где label представляет собой строку, которая идентифицирует задачу.
Возьмите этот график, например:

В этом графике есть две задачи: A и B , и B зависит от A , который представлен стрелкой, которая выходит от B и указывает на A
Это означает, что B может начинаться только после завершения A , и A , поскольку он не зависит от любой другой задачи, может начать сразу.
Таким образом, наиболее эффективной реализацией для этого графика была бы:
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;Задачи также могут зависеть от более чем одной задачи:

На этом графике C зависит как от A , так и B , поэтому он может начинаться только после того, как A и B закончили.
Тем не менее, как A , так и B не зависят от какой -либо другой задачи, поэтому они могут начать сразу.
Наиболее эффективной реализацией для этого графика будет:
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;Задачи также могут иметь несколько разных наборов зависимостей, где, если какой -либо из наборов выполняется, то задача может запустить:

На этом графике C зависит либо от A или на B , который представлен с использованием разных цветов для каждого набора зависимостей. Сами цвета не имеют какого -либо конкретного значения, они используются подобными, чтобы зависимости отличались друг от друга.
Следовательно, C может начать, как только A или B закончится.
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;И последнее, но не менее важное, обещания имеют два возможных результата: они могут быть выполнены или отклонены.

На этом графике у нас есть задача B , которая зависит от A и задачи C , которая зависит от A .
Важный
Пунктирные края используются для представления отказов от перспектива.
Это означает, что B может начинаться только после того, как A выполнится, и C может начать только после того, как A был отклонен.
Поскольку возможно только один из этих результатов, будут выполнены либо B или C
Соответствующая реализация:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
} При выполнении графических упражнений вы заметите, что экспортируются три функции: mixed , asyncAwait , thenCatch .
Идея состоит в том, чтобы предоставить 3 различных реализации:
mixed : этот совершенно бесплатный, вы можете смешать как асинхроasyncAwait : в этом вы должны использовать только Async/ждатьthenCatch : В этом вы должны использовать только тогда/поймать.Таким образом, вы будете опытны в обоих стилях обработки перспектив.
Кроме того, в конце файла вы заметите, что экспорт обертывается в skipExercise , что пропускает тесты для этой конкретной реализации, так что он не засоряет выход.
Поскольку вы реализуете решение для каждого из этих трех, удалите вызов skipExercise для реализации, которую вы хотите, чтобы тесты выполнялись. Например: если вы уже реализовали mixed решение, удалите из него skipExercise , но сохраните его для asyncAwait и thenCatch , пока не реализуете их.
Чтобы помочь вам в отладке вашей реализации для графических упражнений, мы создали пользовательский интерфейс, который позволяет вам моделировать различные «пути выполнения».
Чтобы открыть пользовательский интерфейс, запустите:
npm run graph:uiПользовательский интерфейс обслуживается веб -приложением, и он выглядит так.

Теперь давайте рассмотрим каждый раздел:

Боковая панель слева позволяет выбрать упражнение, в котором вы хотите отладить.

Этот верхний раздел позволяет выбрать реализацию, которую вы хотите отладить.

Правая боковая панель позволяет вам контролировать поток выполнения упражнения, разрешив/отклоняя обещания.
Поскольку обещания создаются, новые записи добавляются на боковую панель.

В этом разделе в центре показаны записи о обещаниях, которые были созданы и разрешены/отвергнуты на каждом этапе.

В этом разделе внизу показано краткое изложение обещаний, которые были разрешены/отклонены на каждом этапе, по порядку.
Поскольку графические упражнения основаны на графиках (DUH), можно автоматически генерировать все возможные тесты для данного упражнения, что мы делаем.
Как можно себе представить, количество сгенерированных тестов иногда является огромным, поэтому у нас есть крышка на максимальном количестве тестов, которые выполняются.
Кроме того, чтобы предотвратить смещения, мы не проводим тесты в порядке, в котором они были сгенерированы, вместо этого мы перетасовываем их.
Эта перетасовка происходит сразу после того, как тесты впервые сгенерированы, так что тесты являются детерминированными , то есть каждый раз, когда вы запускаете тесты на графические упражнения, вы будете выполнять одинаковое подмножество тестов.
Тем не менее, можно настроить как крышку , так и подмножество тестов, которые запускаются.
Чтобы настроить крышку, вы можете запустить npm run graph:setGraphTestsCap <number> .
Например, чтобы установить крышку на 10000, запустите:
npm run graph:setGraphTestsCap 10000 Чтобы настроить подмножество тестов, которые выполняются, вы можете запустить npm run graph:shuffleGraphTestData <graph-exercise-number> , который будет переставлять тесты для указанного графического упражнения, что затем приведет к другой подмножеству тестов.
Например, чтобы перестановляться тестами для графического упражнения № 2, запустите:
npm run graph:shuffleGraphTestData 2Графические упражнения отлично подходят для понимания отношений зависимости между задачами, однако они не охватывают полный спектр возможных сценариев, поскольку только задачи, зависимости которых известны во время компиляции и фиксированные, могут быть представлены графиком.
Поэтому у нас есть эта категория бетонных упражнений, где вам будут представлены конкретные сценарии, которые вам придется реализовать.
Поскольку каждое упражнение в этой категории является уникальным, их описание содержит их папку.
Фонд упражнения предназначены для того, чтобы помочь вам укрепить ваше понимание оснований обещаний, переопределяя функции, связанные с обещаниями, и, в конечном итоге, само обетования.
Описания колокируются упражнениями.
Решения для упражнений можно найти в этом репо, например, https://github.com/henriquinonhe/promises-traing/blob/master/src/exercises/concrete/concurrencybort/exercise.ts.
Тем не менее, мы рекомендуем вам проверить решения только после того, как вы решили упражнение самостоятельно, так как цель состоит в том, чтобы вы научились, решив упражнения.
Кроме того, имейте в виду, что в настоящее время представленные решения не обязательно являются лучшими , что означает, что даже если ваши решения не напоминают те, которые вы найдете здесь вообще, это не значит, что они плохие.
Чтобы облегчить обновление до более новых версий, мы создали сценарий миграции, который автоматически переносит вашу установку в последнюю версию, сохраняя ваши решения.
Чтобы запустить сценарий миграции, запустите:
npm create promises-training@latest -- --migrateЭтот проект лицензирован в соответствии с CC-By-NC-ND 4.0.
Цель этого проекта - быть бесплатным учебным ресурсом и для того, чтобы он оставался свободным и доступным навсегда.
Вот вопросы и ответа некоторых общих вопросов, касающихся лицензии:
Могу ли я использовать этот проект для изучения самостоятельного или группы?
Да, пожалуйста.
Могу ли я использовать этот проект на внутреннем обучении компании?
Да, до тех пор, пока вы причитаете проект и даете понять, что проект свободно доступен независимо от обучения.
Могу ли я использовать этот проект для моих платных наставнических/семинарных сессий?
Да, если вы зачисляете в проект, дайте понять, что проект свободно доступен независимо от наставничества/семинара, дайте понять, что вы заряжаете свое время, а не за сам проект, дайте понять, что проект не является частью вашего собственного материала и дает понять, что мы не поддерживаем вас или ваши услуги.
Могу ли я использовать этот проект для моего платного онлайн -курса?
Да, до тех пор, пока вы считаете проект, дайте понять, что проект свободно доступен независимо от онлайн -курса, дайте понять, что вы взимаете время за свое время, а не за сам проект, дайте понять, что проект не является частью вашего собственного материала и дает понять, что мы не поддерживаем вас или ваши услуги.
Могу ли я создать вилку этого проекта и использовать его для своих собственных целей?
Нет, ты не можешь. Вы можете использовать только этот проект как есть, без каких -либо модификаций. Это необходимо, чтобы люди не создавали вилки, а затем заряжались для них.
Могу ли я создать онлайн -курс на основе этого проекта?
Нет, вы не можете, потому что мы не хотим, чтобы люди создавали «обертки» вокруг этого проекта, а затем взимали за них.
Если у вас есть какие -либо вопросы, касающиеся лицензии, или вы хотите поговорить о конкретном варианте использования, не стесняйтесь связаться со мной по адресу [email protected].