пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Промис в JavaScript — это заменитель (прокси) для значения текущей операции. Обычно мы используем промис для управления ситуациями, когда необходимо дождаться результата операции. Например, при загрузке файлов на сервер и ожидании ответа от API, или просто при запросе у пользователя выбора файла с их компьютера. В этой статье вы узнаете о промисах в JavaScript, создавая реальное приложение, похожее на приведенное ниже: Что такое промис?  Промис — это просто функция, она возвращает объект, к которому можно прикрепить обратные вызовы. Обратные вызовы, прикрепленные к объекту промиса, будут вызываться только после завершения операции. Обратные вызовы будут ожидать, пока операция не будет выполнена или отклонена. fetch(`some_api_url`).then((response) => { // Everything here will wait the fetch operation to complete }); Прежде чем промис окончательно решится (то есть либо выполнится, либо будет отклонен), он должен пройти через разные состояния: Состояние Описание Обратный вызов Ожидание Операция все еще выполняется, и промис находится в ожидании - Выполнен Операция завершена успешно .then() Отклонен Операция завершена с ошибкой .catch() Завершен Промис либо разрешен, либо отклонен, в любом случае вызывается этот обратный вызов .finally() Когда создается промис, начальное состояние — ожидание. Затем, в зависимости от результата операции, промис либо выполняется, либо отклоняется. Из таблицы выше можно легко увидеть обратный вызов, который будет вызван в зависимости от состояния промиса: fetch(`some_api_url`).then((response) => {  // This will get called when the promise fulfills }).catch((error) => {  // This will get called when the promise is rejected }).finally(() => {  // This will get called all the time }) Как использовать промисы в JavaScript Теперь, когда вы узнали, что такое промис, давайте покажем, как вы можете использовать промисы в JavaScript, создав приложение для поиска фильмов, которое мы видели ранее. Базовое приложение для поиска фильмов должно иметь поле ввода, где пользователи могут искать свои любимые фильмы. Также должно быть пользовательский интерфейс для отображения базовой информации о найденном фильме. Давайте начнем с создания HTML. Как написать HTML Для целей этого руководства и чтобы показать живые примеры, я буду использовать Codepen, но вы можете использовать ваш любимый редактор кода. Создайте файл index.html и добавьте следующий код:             Movie
               
                                         
                        
         
      
                                           
                       
            
                           

Details

                               
  • Premiered: 
  •                 
  • Rating: 
  •                 
  • Runtime: 
  •                 
  • Status: 
  •                            
                                           Watch Movie           
                                                
                  
    Мы создали скелет нашего приложения для фильмов. Теперь давайте оживим его с помощью CSS: %[https://codepen.io/Spruce_khalifa/pen/wvygzLq?editors=0100] Как получить фильм Чтобы получить наш фильм, мы будем использовать API TVMAZE. Создайте файл main.js и добавьте следующий код: const get_movie = (value = "Game of thrones") => {   fetch(    `https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`  ).then((response) => create_UI(response.json())); }; Мы создали функцию get_movie(value = "Game of thrones"), которая использует API fetch в JavaScript. Мы используем его для выполнения GET запроса к нашему API фильмов. API fetch возвращает промис. Чтобы использовать ответ от API, мы прикрепляем обратный вызов .then(), в который передаем response.json() в новую функцию create_UI(). Давайте создадим функцию create_UI: const create_UI = (data) => { const movie_img = document.querySelector("#img_src"); const movie_icon = document.querySelector("#img_icon"); const movie_title = document.querySelector(".movie_title"); const movie_desc = document.querySelector(".movie_desc"); const movie_link = document.querySelector(".btn"); const movie_date = document.querySelector("#movie_date"); const movie_rating = document.querySelector("#movie_rating"); const movie_runtime = document.querySelector("#movie_runtime"); const movie_status = document.querySelector("#movie_status"); // set the UI  movie_icon.src = data.image.medium;  movie_img.src = data.image.original;  movie_title.textContent = data.name;  movie_desc.innerHTML = data.summary;  movie_link.href = data.officialSite;  movie_date.textContent = data.premiered;  movie_rating.textContent = data.rating.average;  movie_runtime.textContent = data.runtime;  movie_status.textContent = data.status; }; Эта функция, как следует из названия, помогает нам создать пользовательский интерфейс для нашего приложения фильмов. Но нам все еще нужен способ получить имя фильма от пользователей, так что давайте это исправим. Первое, что нам нужно сделать, это добавить обработчик события onsubmit в нашу HTML-форму:
      //
    Теперь в нашем файле main.js мы можем обработать то, что происходит при отправке формы: // handle form submit const search = (event) => {  event.preventDefault(); const value = document.querySelector(".header_form-input").value; get_movie(value); }; Каждый раз, когда пользователь отправляет форму, мы получаем значение, которое они ввели в поле поиска, и передаем его в функцию get_movie(value = "Game of thrones"), которую мы создали ранее. Цепочка промисов В отличие от того, что мы видели в предыдущих примерах, обратный вызов .then() не является концом. Дело в том, что когда вы возвращаете значение промиса, вы получаете другой промис. Это становится очень полезным, когда вы хотите выполнить серию асинхронных операций по порядку. Например, наше API фильмов не только возвращает информацию о фильме, но и информацию обо всех эпизодах. Допустим, что мы действительно не хотим отображать все эпизоды "Игры престолов", нам нужны только первые четыре (4) эпизода. С помощью цепочки промисов мы можем легко этого достичь: const get_movie = (value = "Game of thrones") => {  fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      if (data._embedded.episodes.length > 0) {        const new_data = data._embedded.episodes.slice(0, 4);        create_UI(data);        return create_episodesUI(new_data);      } else {        return create_UI(data);      }    }); }; Это все та же функция get_movie(), но на этот раз, вместо того чтобы передавать данные в функцию create_UI, мы возвращаем ответ .then((response) => response.json()). Это создает новый промис, к которому мы можем прикрепить дополнительные обратные вызовы. В идеале эта цепочка может продолжаться бесконечно. Помните, что все, что вам нужно сделать, это вернуть значение промиса. Как обрабатывать ошибки в промисах Ошибки, которые происходят в промисе, немедленно попадают в обратный вызов .catch(): fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      // any error here will trigger the .catch() callback    }).catch((error) => {    // all errors are caught and handled here    }) Обратный вызов .catch() является сокращением для .then(null, (error) => {}). Вы также можете написать это так: fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      // any error here will trigger the .catch() callback    }, (error) => {    // all errors are caught and handled here    }) В нашем приложении для поиска фильмов, например, когда мы сталкиваемся с ошибками, мы можем обработать и отобразить пользователям приятное сообщение об ошибке в обратном вызове .catch(): const get_movie = (value = "Game of thrones") => { fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      if (data._embedded.episodes.length > 0) {        const new_data = data._embedded.episodes.slice(0, 4);        create_UI(data);        return create_episodesUI(new_data);      } else {        return create_UI(data);      }    })    .catch((error) => {      console.log(error.message);      // Challange: display your error here    }); }; Теперь, если по какой-то причине мы получаем ошибку, обратный вызов .catch() будет вызван, и мы отобразим корректную ошибку пользователю. Как создать промисы в JavaScript Теперь, когда мы узнали, что такое промисы и как их использовать, давайте посмотрим, как мы можем создать промис в JavaScript. Чтобы создать промис в JavaScript, используйте конструктор промиса. Конструктор принимает один аргумент: функцию с двумя параметрами, resolve и reject: const is_true = true const new_promise = new Promise((resolve,reject) => {  if(is_true) {    // everything went fine    resolve()  } else {    // Oops there was an error    reject()  } }) Затем мы можем использовать наш new_promise, прикрепляя к нему обратные вызовы: new_promise .then((response) => {    // everything went fine }) .catch((error) => {    // handle errors }); Подведем итоги В этом руководстве мы узнали о промисах, что это такое и как их использовать, создавая приложение для поиска. Счастливого кодинга!
    img
    В качестве меры избыточности можно развернуть вместе несколько устройств ASA от Cisco в отказоустойчивой конфигурации, именуемой как реализация высокой доступности (High Availability). Для реализации данной схемы требуются абсолютно идентичные ASA, то есть чтобы устройства имели идентичное программное обеспечение, лицензирование, память и интерфейсы. Существует три возможных варианта реализации схемы High Availability для защиты от простоев. Реализация отказоустойчивости Active/Standby: в этой модели только один из брандмауэров отвечает за обработку трафика, в то время как другой становиться "горячим" резервным устройством. Резервное устройство начинает обработку трафика в случае сбоя активного устройства. Реализация отказоустойчивости Active/Active: в этой модели оба брандмауэра активно обрабатывают трафик как кластер. При выходе из строя одного из устройств, сеть будет продолжать нормально функционировать, так как они имеют одинаковые (дублирующие) настройки. Данная реализация чуть сложнее и требует использования нескольких контекстных режимов. В режиме множественного контекста можно разделить одно устройство ASA на несколько виртуальных, известных как контексты безопасности. Каждый контекст безопасности действует как независимое устройство со своими собственными политиками, интерфейсами и администраторами. Поэтому несколько контекстов представляются как отдельные автономные устройства. Для реализации отказоустойчивости Active/Active используются два физических брандмауэра. На каждом из этих брандмауэров настраивается несколько виртуальных брандмауэров или контекстов безопасности. В примере выше в ASA 1 настраиваются контекст безопасности 1 и контекст безопасности 2. Аналогично настраивается и ASA 2: Следующий шаг состоит в том, чтобы взять виртуальные контексты безопасности и разделить их на отказоустойчивые группы. Отказоустойчивая группа- это просто логическая группа одного или нескольких контекстов безопасности. Аса-1 определена в качестве основного устройства, активной для отказоустойчивой группы 1. Аналогично, ASA 2 определена как вторичное устройство, активное для отказоустойчивой группы 2. Контексты безопасности разделяются и назначаются следующим образом: ASA 1: Контекст безопасности 1 Назначена отказоустойчивая группа 1 Контекст безопасности 2 Назначена отказоустойчивая группа 2 ASA 2: Контекст безопасности 1 Назначена отказоустойчивая группа 2 Контекст безопасности 2 Назначена отказоустойчивая группа 1 Нагрузка распределяется таким образом, что обе ASA активны. Таким образом достигается избыточность. Реализация отказоустойчивого кластера: это объединение нескольких ASA в кластеры, действующих как единое логическое устройство. Интеграция и управление по-прежнему работают так, как если бы это было единое устройство, но кластеризация обеспечивает более высокую пропускную способность и избыточность. Это работает в модели slave/master аналогично тому, как работает массив RAID- дисков. Если одно устройство ASA, входящее в кластер, выходит из строя, другое берет на себя операции до тех пор, пока не будет заменен отказавший брандмауэр. Интерфейсы соединяются с двумя различными коммутаторами, причем виртуальный канал порта соединяет коммутаторы вместе. Это должно быть сделано как на внутренней, так и на внешней зонах безопасности.
    img
    Всем привет! В этой статье рассказываем про настройку DHCP-ретранслятора с поддержкой HSRP. Настройка DHCP-ретранслятора с поддержкой HSRP Протокол динамической конфигурации хоста DHCP обеспечивает механизм передачи информации о конфигурации хостам в сети TCP/IP. Агент ретрансляции протокола динамической конфигурации хоста (DHCP) - это хост или IP-маршрутизатор, который ретранслирует пакеты DHCP между DHCP-клиентами и DHCP-серверами. Агент ретрансляции DHCP пересылает пакеты пакеты discover, offer, reply и ack DHCP между клиентами и серверами, когда они не находятся в одной физической подсети. В случае ретрансляции DHCP маршрутизатор не просто направляет пакет в соответствии с полем DEST ID в IP-пакете, но вместо этого создает новое сообщение DHCP, которое будет отправлено на настроенный сервер имен. Агент ретрансляции также устанавливает IP-адрес шлюза (поле GIADDR пакета DHCP) и, если он настроен, добавляет к пакету опцию информации агента ретрансляции (опция 82). Ответ с сервера пересылается клиенту после удаления опции 82. Таким образом, агенты ретрансляции DHCP устраняют необходимость наличия DHCP-сервера в каждой физической сети. Эта статья описывает общее развертывание, где у нас есть маршрутизаторы, настроенные как агент ретрансляции DHCP наряду с протоколом FHRP, HSRP, используемым в сегменте клиента DHCP. Рис. 1.1 Управляемый DHCP-ретранслятор В топологии ниже маршрутизаторы ALT_1 и ORL являются узлами HSRP для подсети LAN 176.18.3.0/24. На обоих маршрутизаторах настроены интерфейсы Fa5/0 с помощью DHCP Relay Agent. Настройки на маршрутизаторах R2 и R3, показаны ниже: ALT_1 int Fa5/0 ip add 176.18.3.2 255.255.255.0 ip helper-address 3.3.2.4 standby 1 ip 176.18.3.1 standby 1 priority 120 standby 1 preempt ORL int Fa5/0 ip add 176.18.3.3 255.255.255.0 ip helper-address 3.3.2.4 standby 1 ip 176.18.3.1 standby 1 priority 100 standby 1 preempt ! Сообщение запроса Bootstrap от клиента будет поддерживаться как маршрутизаторами ALT_1, так и маршрутизаторами ORL и будет перенаправлено на DHCP-сервер, настроенный с помощью команды ip helper-address. DHCP-сервер отправляет ответ как агентам ретрансляции 176.18.3.2, так и агентам ретрансляции 176.18.3.3, которые, в свою очередь, будут перенаправлены в дальнейшем на DHCP-клиент. Если клиент недостаточно интеллектуальный, он может запутаться с этими двумя запросами, поступающими от DHCP-сервера. Чтобы преодолеть эту ситуацию, мы можем настроить DHCP Relay Agent с осведомленностью о HSRP, что выполняется добавлением следующих команд как к активным, так и к резервным маршрутизаторам HSRP: ALT_1: int Fa5/0 ip helper-address 3.3.2.4 redundancy HSRP standby 1 name HSRP ! ORL: ! int Fa5/0 ip helper-address 3.3.2.4 redundancy HSRP standby 1 name HSRP ! При приведенной выше конфигурации сообщение запроса Bootstrap будет инициировано только активным маршрутизатором HSRP ALT_1, поскольку это активный маршрутизатор HSRP (из-за более высокого настроенного приоритета HSRP). Теперь DHCP-сервер получает только одно сообщение обнаружения DHCP только от одного маршрутизатора, и он отправляет ответное сообщение только на один из двух маршрутизаторов, откуда он его получил. Следовательно, клиент теперь получит пакет DHCP OFFER только один раз, и то тоже от маршрутизатора ALT_1 router.
    ЗИМНИЕ СКИДКИ
    40%
    50%
    60%
    До конца акции: 30 дней 24 : 59 : 59