Объект обещания представляет собой задачу, которая в конечном итоге будет завершена. Он предлагает множество замечательных функций и API, которые облегчают дело с задачами, которые будут проходить неопределенное количество времени для завершения. Такие вещи, такие как сетевые звонки, запрашивая базу данных или делать все, что может быть интенсивно, как оказание множества предметов, следует использовать обещание.
Почему обещания?
При работе с ситуацией, когда трудно определить, когда задача будет завершена, поскольку это зависит от внешней службы, которую мы не контролируем. Обещающие объекты – это средство для обработки этих проблем асинхронно с эффективной API. Ранее в JavaScript мы использовали обратные вызовы, чтобы обрабатывать асинхронные задачи, однако обратные вызовы имели много проблем, когда она пришла к обработке асинхронных задач, которые зависят друг от друга и, следовательно, были рождены обещания. Давайте сделаем Новое обещание
const someTask = new Promise((resolve, reject) => {})
Самый простой способ создать обещание – это вызвать Новое обещание
конструктор. Давайте посмотрим на пример
3 состояния обещания
- Ожидается – когда вы вновь создаете обещание, это будет ожидаться
- Выполнено/решено – когда обещание было решено
- Отклонено – когда произошла ошибка, и обещанное значение не может быть определено
Итак, мы создали A Новое обещание
и пройти в функции с 2 аргументами решить
и Отклонить
. Что это решить
и Отклонить
можно спросить. По существу решить
должны быть вызваны, когда задача была успешно выполнена и Отклонить
следует назвать, если задача не удалась. Давайте сделаем наш пример дальше. Мы будем использовать SettimeOut для моделирования асинхронизации, которая займет некоторое время для завершения. Эта задача в основном займет около 500 мс для завершения.
const calculation = new Promise((resolve, reject) => { setTimeout(() => resolve(1 + 1), 500) })
По сути, внутри обещания вы вызываете разрешение, когда задача завершена. В основном, как обещание знает, что задача была «решена»
После того, как вы определите обещание, следующее, что вы должны иметь возможность получить результат этой функции. Следующий код будет регистрировать результат к консоли. В этом случае мы добавляем 1 + 1, поэтому мы получим 2, возвращенные в консоль.
calculation.then(result => console.log(result)) => 2
Отклонение результата (обработка ошибок)
Допустим, например, у нас есть следующие, мы пытаемся выяснить, если у кого-то может быть кофе или нет.
const age = 7 const user = {name: 'zack'} const checkCoffeeAble = new Promise((resolve, reject) => { if (age >= 18) { resolve(user) } else { reject("cannot have coffee") } }) const canHaveCoffee = (result) => { localStorage('coffee_drinker', result.name) } const cannotHaveCoffee = (result) => { console.log(result) } checkCoffeeAble.then(canHaveCoffee, cannotHaveCoffee)
В этом случае мы усердно кодируем возраст, поэтому мы, вероятно, получим вывод отклоненного результата в консоль. Но точка зрения вы можете видеть, что мы все еще обращаемся к отклонениям, используя, мы просто передаем отклоненную функцию в качестве второго аргумента. Мы также можем использовать такое улов.
checkCoffeeAble.then(canHaveCoffee).catch(cannotHaveCoffee)
Затем мы на самом деле посмотрим на реальный пример, где мы фактически сделаем сетевой звонок, чтобы определить какой-то результат с базовой логикой.
Более надуманный пример
Допустим, мы хотим быть в состоянии запросить Github для популярного репо, по названию, мы проходим в названии темы, и результат будет отображаться на DOM. Так что основной поток будет примерно таковым.
- Сделайте звонок в Github, используя Fetch
- Получите данные из GitHub и итерации через него, используя карту внутри обещания
- Делайте результаты на страницу.
- Если нет результатов, мы оказываем сообщение об ошибке.
Причина, по которой мы делаем это таким образом
- Мы не хотим просто использовать привлечение, так как Fetch уже возвращает обещание по умолчанию
- Мы хотим, чтобы какая-то рабочая нагрузка может быть решена с новым обещанием
- Давайте Setimeate и Console.log может сделать довольно скучный пример
Мы будем использовать обещание для цикла по результатам и генерировать HTML, который мы будем использовать для обновления DOM. Вот JS-код и кодовая коробка Отказ
import "./styles.css"; const headers = { Accept: "application/vnd.github.mercy-preview+json" }; const getResults = topic => fetch(`https://api.github.com/search/topics?q=${topic}`, { headers }) .then(response => response.json()) .then(body => body.items); const renderItems = items => new Promise((resolve, reject) => { if (Array.isArray(items) && items.length > 0) { const data = items.map(item => `${item.name}
`).join(""); resolve(data); } else { reject("no results found try a different topic"); } }); const searchTopics = topic => { document.getElementById("app").innerHTML = "Loading...
"; getResults(topic) .then(renderItems) .then(html => { document.getElementById("app").innerHTML = ``; }) .catch(error => { document.getElementById("app").innerHTML = `results for: ${topic}
${html}${error}`; }); }; // try passing in "89348598095380953" for error response searchTopics("machine learning");
Основная функция, использующая пользовательское обещание здесь.
const renderItems = items => new Promise((resolve, reject) => { if (items.length > 0) { const data = items.map(item => `${item.name}
`).join(""); resolve(data); } else { reject("no results found try a different topic"); } });
Давайте немного рассмотрим в заявлении, если вы проверяете, что сетевой звонок фактически возвратил результат. Если ничего не возвращалось, мы используем отклонение, если что-то вернулось, мы переживайте и используем решимость, когда итерация выполняется.
Вот как это называется.
getResults(topic) .then(renderItems) .then(html => { document.getElementById("app").innerHTML = `${html}`; }) .catch(error => { document.getElementById("app").innerHTML = `${error}`; });
Сначала мы используем GetResults (тему), то мы проходим в наших рендеревых обещаний в качестве функции обратного вызова, а затем мы обращаемся к сценарию успеха, что сделаем результаты в результатах Div, и если у нас нет никаких возвращаемых результатов, мы поймаем, и визуализировать сообщение по ошибке. девочка
Заворачивать
Обещания могут показаться немного пугающим сначала, но в целом открывается лучший способ написать асинхронный код, не страдающий от обратного вызова ада. Этот пост подразумевается в качестве грунтовки по обещаниям, в следующем посте мы покажем вам альтернативный синтаксис (Async/aquait) для обещаний, которые позволяют еще проще написать ASYNC код в JavaScript, и мы увидим, как мы можем убирать наш Пример с использованием async/a ждать.
Если у вас есть какие-либо вопросы/проблемы по поводу этого поста, не стесняйтесь Задайте вопрос или дайте отзыв здесь Отказ