пїЅпїЅпїЅпїЅ
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Прямо сейчас, пока ты читаешь эту статью, в серверной комнате организации А под толстым слоем пыли, окруженная множеством переплетенных проводов мигает разноцветными лампочками офисная АТС. Но давайте будем тише - дежурный IT - специалист, скорее всего спит, поставив переадресацию на мобильный телефон - а вдруг что - то сломается?
Вообще, облака, на своем старте - наделали шума. Все начали задаваться вопросом - а зачем нам сервер в офисе, когда можно арендовать VPS/VDS/SaaS в облаке и “не париться”?
В статье мы ответим на вопрос - почему одни компании выносят свою телефонию в облако или покупают услугу виртуальной АТС, тем самым создавая возможность поставить вендинговую машину или настольный теннис в серверной комнате, а другие, продолжают перебирать провода, протирать пыль с серверов и наслаждаться мерцанием цветовых серверных индикаторов от офисной АТС.
Бюджет: сравниваем облако и размещение в офисе
Первое, что стоит спросить себя - а как мы будем платить за АТС? Что для нас важно, а что нет? Мы, как интегратор, все чаще сталкиваемся с тем, что в компаниях (SMB) идет сокращение бюджета на IT и соответствующие отделы находят выходы из этой ситуации.
С точки зрения локальной (офисной) АТС - далее мы будем называть ее порой “on-premise” решение (говоря так, мы чувствуем себя немного круче), IT - отдел экономит деньги ежемесячной оплате хосту (SaaS платформе, которая дает вам услугу виртуальной АТС). Но эта экономия реальна только в том случае, если вы не меняете аппаратные компоненты сервера с АТС. В таком случае модель вы платите только за услуги провайдера, электричество и заработную плату IT’шнику. Модель “купил - запитал - работает, не трожь” работает, более чем.
Однако, в случае выхода из строя того или иного компонента, компания несет определенного рода дополнительные расходы. Отметим, опять же, на нашем опыте - случается это редко. Современные сервера имеют высокое качество комплектующих, и если вы не планируете поливать сервера водой, обдавать из огнемета или выставлять на улице - скорее всего, данная неприятность вам не грозит.
Не менее важный фактор - обновление ПО. Проблема в том, что если вы обновляете программное обеспечение офисной “on-premise” (да - да, мы же предупреждали) АТС, есть риск выхода из строя. Опять же, данная проблема решается простым резервированием, так называемой отказоустойчивостью, по принципу Active - Standby (один сервер активен, а второй в резерве и всегда готов выйти в активную роль). Этот нюанс требует дополнительной проработки, а следовательно, дополнительных денежных затрат.
Теперь про масштабируемость. В случае, если проснувшись в один прекрасный день вы осознаете, что ваш бизнес вырос в разы (вы сходили на бизнес - тренинг, к шаману или проделали магический обряд), то офисные локально размещенные станции масштабируются несколько сложнее и затратнее, чем виртуальные. Это отражается на деньгах и стоимости масштабирования.
Тут есть важный пункт - офисная АТС гораздо более гибка, чем виртуальная. Дело в том, что виртуальная АТС дается вам в неком готовом контейнере предустановок, где SaaS платформа редко дает возможность доработки станции. Да, признаем, некоторые облачные АТС имеют API, но когда вопрос заходит о масштабном изменении логики работы АТС (кастомизация скриптами, например) - тут происходит коллапс. В этом плане офисные АТС явно выигрывают перед облачными, несмотря на стоимость затрат на эту самую кастомизацию. Просто сам факт ее возможность при быстром росте бизнеса - это преимущество (поверьте, знаем о чем говорим на опыте разных проектов).
Редкие, но некоторые IT - отделы предпочитают облачную телефонию. Это более предсказуемо и снимает с них часть ответственности. Например, когда директор компании задает вопрос ITшнику почему не работает телефония, тот может смело спихнуть ответственность на виртуального хостера.
Модернизация и апгрейд: витаем в облаках или в офисе?
Тут пальму первенства заслуженно забирают облака. Дело в том, что если у вас в офисе живет on-premise АТС, так или иначе, рано или поздно вам придётся обновлять аппаратные компоненты сервера (процессор, оперативная память, наращивать мощность RAID массивов, тем самым увеличивая пространство для хранения данных). Это происходит по двум причинам: растёт нагрузка на сервер и текущие мощности уже не справляются, или обновление программного обеспечения требует более производительных комплектующих. При облачном размещении таких проблем нет - ваш хост автоматически наращивает мощности виртуальной машины, внутри которой живет ваша АТС. Это, безусловно, сказывается на мощности, но выходит дешевле покупки комплектующих под локальных сервак.
Кстати про обновление - в случае решения, размещённого в вашем офисе, обновление ПО производят ваши ITшники, тогда как при размещении в облаке, хост сам обновляет ПО и раскатывает их на боевую среду.
Интеграция телефонии с внешними системами
Любителям on-premise решений посвящается. Откиньтесь на диване поудобнее - в этой главе уже есть победитель. И это не облако.
Дело в том, что с ростом компании, уровень технологичности неизбежно повышается. Новые направления деятельности и увеличение потока клиентов обязывают связать ИТ - узлы в единую экосистему: интеграция телефонии и CRM, справочниками, базами данных, звонки по нажатию, триггерный автоматический обзвон, предиктивный дайлер и прочие. Все эти “хотелки” так или иначе требуют доработки вашей станции, так как интеграцию со всем на свете разработчики облачный виртуальных АТС предусмотреть не могут, а открыть исходный код и раздвинув горизонт кастомизации до бесконечности, рискуют получить уязвимости в безопасности.
Именно по этой причине, офисная коробка дает больше. Например: вы хотите сделать маршрутизацию на базе гороскопа клиента. В вашей CRM есть номер телефона клиента, имя и его дата рождения. При входящем звонке, телефония “смотрит” в вашу CRM и видит месяц рождения клиента (по номеру, с которого он звонит). Кастомная прослойка понимает - он рыба, а рыбам, сегодня не рекомендуется иметь деловых отношений. И на базе этого решения офисная телефонная станция терминирует вызов. Как вам?
Пожалуй, надо признать, пример весьма спорный. Но посыл понятен - коробка в офисе даст больший пул возможностей, а облако, максимум, обрезанный API.
Катастрофы: коробки или облако?
В офисе над вами прорвало трубу и залило серверную (мы реально встречали такие кейсы). Сервера вышли из строя, не работает ничего. Есть две новости, начнем с хорошей:
Сервер был на гарантии и имеется контракт на горячую замену от интегратора;
Сервера больше нет.
Несмотря на контракт горячей замены, просто в минимум 24 часа вам гарантирован (если не реализована схема отказоустойчивости с географически распределенными серверами по ЦОДам).
В облаке, как правило, SaaS дает вам гарантию работоспособности от 90%. Облачная вычислительная мощность живет в разных ЦОДах, при отказе аппаратного сервера, виртуальная машина с вашей ВАТС переедет на другой аппаратный сервер за сотые доли секунды. Что неплохо.
Тут, пожалуй, для SMB компании первенство мы отдадим облаку.
Итоги
Как облака, так и размещенные в офисе решения имеют свои преимущества. Если курс вашей компании на безграничную кастомизацию, интеграцию всех ИТ - систем между собой для создания экосистемы и амбициозные бизнес - процессы, у вас есть грамотный IT - специалист, то выбирайте коробку, которую вы разместите в офисе.
Если вы не хотите проблем с сервером, обслуживанием, вы малый бизнес, у вас нет своего IT’шника в штате и хотите рабочую телефонию с минимумом головной боли - облако подойдет под ваши требования.
Промис в 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 и добавьте следующий код:
Мы создали скелет нашего приложения для фильмов. Теперь давайте оживим его с помощью 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
});
Подведем итоги
В этом руководстве мы узнали о промисах, что это такое и как их использовать, создавая приложение для поиска.
Счастливого кодинга!
Movie
Привет, дорогой любитель автоматизации с помощью бизнес - процессов! Мы очень рады, что в поисках полезной автоматизации обработки лидов в Битрикс24 ты нашел эту статью. Все потому, что мы тоже любим упрощать работу себе и своим сотрудникам, поэтому вот тебе кейс:
Валерий – успешный менеджер по продажам. К нему прилетает лид. У Валерия есть только его электронная почта – оставлять телефон лид не захотел/не смог. После первичной обработки (выяснение потребностей, требований к услугам и так далее) лид сообщает, что не может ответить на некоторые вопросы и просит тайм – аут – предположим, пару дней. Конвертировать в сделку лида рано – мы не знаем ключевых параметров для формирования коммерческого предложения. Лид так и остается MQL (Marketing Qualified Lead) сущностью.
В силу некоторых анатомических особенностей, Валерий бывает забывчив. В потоке новых лидов, которых он успешно конвертируется в SQL (Sales Qualified Lead), Валерий забывает про MQL лида. Но не забывает бизнес – процесс, о котором мы сейчас и расскажем.
Битрикс24 бесплатно!
Битрикс24 общается с лидом за вас
Бизнес процесс работает следующим образом:
Менеджер ставит лид в статус «Дожимаем лида»;
Запускается цикл, который будет выполнятся до тех пор, пока лид находится в статусе «Дожимаем лида»;
Бизнес-процесс берет паузу в 3 рабочих дня и спустя это время отправляет первое письмо лиду. Письмо будет отправляться от email адреса ответственного, с обращением к лиду по имени и формированием небольшой подписи в письме. Письмо отправляется такого содержания : Принято ли решение по проекту «%название_лида%». Параллельно с этим ответственному приходит сообщение об отправке внутри Битрикс24;
После выполнения предыдущего шага, снова берется пауза в три рабочих дня, после чего отправляется письмо лиду другого содержания: Очень хотим с Вами работать :) Принято ли решение по проекту «%название_лида%»?. Параллельное уведомление приходит и ответственному;
После чего, указанные выше шаги повторяются еще 2 раза (то есть общее число отправленных писем с интервалом в 3 рабочих дня будет равно 6);
После отправки шестого письма бизнес процесс прервется;
Очень советуем настроить триггеры в Битрикс24. Например, при событии «Входящее письмо» и «Входящий email» у вас будет переключаться статус – тем самым, при наличии активности по лиду (переписка, звонок) бизнес процесс будет прерываться.
Блок-схема работы указана ниже:
Настройка бизнес - процесса
Итак, переходим к разбору полетов. Открываем CRM → Настройки → Автоматизация → Бизнес - процессы. В разделе «Лид» нажимаем добавить шаблон: даем первичное название и описание шаблону, предварительно сняв галочки на параметру автоматического запуска (запускать бизнес процесс мы будем изнутри другого процесса).
Скачать бизнес – процесс для лидов в Битрикс24
Переходим во вкладку «Переменные» и создаем две служебных переменные, нажав «Создать переменную»:
Идентификатор mail_choose
Название: - выбор письма для отправки;
Описание: - переменная содержит в себе либо 1, либо 2. В зависимости от значения, Заказчику будут отправляться разные письма;
Тип: - целое число;
Значение по умолчанию: - 0;
Идентификатор count
Название: - счетчик отправок;
Описание: - когда клиенту будут отправлены 2 формата письма - мы будем увеличивать значение этой переменной на 1;
Тип: - целое число;
Значение по умолчанию: - 0;
Общая структура нашего бизнес – процесса следующая:
Первый элемент – «Цикл». Условно говоря, это блок, в котором задается некое условие, и, до тех пор, пока это условие выполняется, все элементы внутри цикла будут прогоняться снова и снова. Лишь в том случае, когда условие не выполнится, цикл будет завершен. В нашем случае условием «Цикла» будет статус лида. Пока он равен статусу «Дожимаем лида» - цикл жив:
Итак, цикл начинается. Первым действием мы увеличиваем переменную mail_choose на 1 (ее значение по умолчанию 0). Это нужно для выбора письма, которое мы будем отправлять лиду. Для этого, мы выбираем блок «Изменение переменных», выбираем переменную «Выбор письма для отправки» и приравниваем ее к значению =({=Variable:mail_choose}+1). Переменная будет увеличена на 1.
Добавляем блок «Пауза в выполнении». Здесь мы будем ставить бизнес – процесс на паузу на 3 рабочих дня. В разделе «Режим» выбираем чек-бокс «Время» и в поле «Дата» добавляем следующий код: =addworkdays({=System:Now}, 3)
Приступаем к отправке. Данный блок будет отработан только после паузы в 3 рабочих дня. Первым делом, нам надо убедиться, что количество отправленных писем клиенту не равно 6 (мы не хотим отправлять клиенту больше 6 писем с напоминанием о себе). Счетчик с идентификатором count увеличивается каждый раз, когда клиенту отправляется четное письмо. Это значит, что уходит первое письмо – счетчик не увеличивается. Уходит второе – прибавляем 1 к переменной count. Уходит третье – ничего. Уходит четвертое - + 1. И так далее. В результате, когда переменная будет равна 3, мы будем завершать наш бизнес процесс.
Если наш счетчик меньше 3, то мы переходим к выбору письма. Тут в игру вступает переменная mail_choose. Сейчас она равна 1 (мы увеличили ее в начале цикла). Поэтому, мы отправляем первое письмо и уведомление ответственному:
После отправки уведомления бизнес процесс переходит в начало цикла. Там мы опять увеличиваем переменную mail_choose на 1, проходим паузу и условие. Теперь наша переменная равна 2, поэтому, мы отправляем лиду второй вариант письма:
Второе письмо отправлено, и теперь, нам нужно обработать наши переменные:
=({=Variable:count}+1) - увеличиваем счетчик отправок на 1;
Выбор письма для отправки - приравниваем к 0;
Вот и все. Теперь все происходит по новой, но переменная count = 1. Пока count не достигнет значения 3, цикл будет повторяться. Для этого, заранее настраиваем запуск этого бизнес – процесса при переключении статус лида на «Дожимаем лида». Давайте протестируем: переводим лида в нужный статус:
О том, как создать запуск бизнес – процесса по переключению статус лида можете прочитать в этой статье.
Через 3 дня нам (лиду) приходит первое письмо:
И еще через 3 дня приходит второе письмо:
Удачных полетов :)
