Я багато разів стикався з цим терміном, і навіть після гуглювання все ще не можу зрозуміти, що саме він означає. Чи існує якесь легке для розуміння (в ідеалі на прикладах) визначення того, що асинхронна подія може надати хтось?
Дякую!
Відповіді:
Приклад непрограмування:
Синхронно Ви хочете піцу на вечерю, і ви не в мороженому вигляді. Тож вам доведеться припинити гру WOW, яка засмучує вашу гільдію. Ви йдете на кухню, готуєте тісто, покриваєте його соусом, додаєте сир і гасите його своїм улюбленим беконом. Ви щойно витратили 20 хвилин свого часу, готуючи піцу, ще 10 хвилин у духовці. Таймер подає звуковий сигнал, і ви виймаєте гарячий пиріг. Ви можете присісти перед своїм комп’ютером, з’їсти піцу і продовжити свій рейд.
Асинхронний Ви хочете піцу на вечерю, граючи в WOW. Ви відкриваєте вікно браузера на вашому 5-му моніторі. Ви завантажуєте веб-сайт "Піца" і замовляєте свою додаткову сирну піцу з беконом з додаванням жиру з беконом часниковим соусом. Ви повертаєтесь до свого рейду, і через 20 хвилин у двері дзвонить дзвінок. Ви отримуєте піцу. Ви присідаєте за комп’ютером, їсте піцу і продовжуєте свій рейд.
То яка різниця? В один спосіб ви витрачаєте 20-30 хвилин дорогоцінного часу WOW, в інший спосіб витрачаєте 20 доларів плюс чайові.
Ваша сторінка доставляється з сервера в браузер клієнта, десь там, в Інтернеті. Браузер намалював сторінку на екрані, і хтось - або щось інше - дивиться на неї. Це гра очікування. Очі рухаються вперед-назад, швидко вскакуючи в ту чи іншу деталь, час від часу кидаючись убік, від екрана, щоб дослідити відволікаючі фактори в навколишньому середовищі. Годинник тикає. Сторінка світиться м’яко, пасивно, коли користувач панує в неактивному режимі, рука вільно накинута на мишу, зігнута шия, і очі все більше і більше пильнують про щось привабливе, що може запропонувати ваша сторінка.
Раптом, без будь-якого попередження, курсор починає рухатись, коли рука на миші злегка застигає і починає штовхати маленький пластиковий горбок по шорсткій поверхні столу. Коли миша рухається, її сурогат на екрані рухається з близькою імітацією, випасуючи минулі цікаві зображення та дотепні зауваження у вмісті вашої сторінки. Зрештою приймається рішення, рух робиться на паузу, м’яз або два злегка стискаються, і кнопка миші натискається наполегливим пальцем. Мікроперемикач у миші спрацьовує електронний імпульс, і раптом браузер отримує інформацію про те, що сталося: клацання миші.
При цьому все, що робив користувач, дивлячись на сторінку, відбувалося абсолютно непередбачувано для браузера, для будь-якого клієнтського коду на вашій веб-сторінці та для всього, що проживає на ваших серверах. Між людськими діями не було відомого «часу очікування». Отже, дії, передані обладнанням, підключеним до комп'ютера користувача, відбувались тоді, коли вони відбувались, а не за передбачуваним годинником - тобто вони відбувалися асинхронно .
Подумайте про кінець співбесіди, і хлопець каже: "Не дзвоніть нам, ми зателефонуємо вам". У цьому суть асинхронної події.
Зазвичай ви визначаєте функції і викликаєте функції явно. Ваша програма має структуру, де вона починається з рядка 1, потім рядка 2, і крім деякого умовного коду та ітерацій, функцій виклику тощо, існує проста, лінійна, синхронна структура.
Але в деяких випадках у вас є дії, які ініціюються подіями, що не залежать від безпосереднього контролю програми, речами, що надходять поза програмою, наприклад подіями користувальницького інтерфейсу (користувач клацає мишею) або мережевою подією (хтось намагається підключитися до вашого сервера). Ваш код не генерує ці події безпосередньо. Вони генеруються поза вашою програмою, часто ОС здійснюється на основі їх моніторингу пристроїв інтерфейсу користувача та інших систем. Це називаються асинхронними подіями.
Просто пам’ятайте: "Не дзвоніть нам, ми зателефонуємо вам"
"У програмуванні асинхронні події - це події, що відбуваються незалежно від основного потоку програми. Асинхронні дії - це дії, що виконуються в неблокуючій схемі, що дозволяє продовжувати обробку основного потоку програми."
"За допомогою Ajax веб-програми можуть отримувати дані із сервера асинхронно у фоновому режимі, не втручаючись у відображення та поведінку існуючої сторінки."
Коли ви натискаєте "Змінити" та "Зберегти на SO", це відбувається асинхронно.
Асинхронна подія - це подія, яка працює поза основним потоком програми.
Найкращий спосіб зрозуміти - це порівняння з подіями, які працюють синхронно. Найбільш типовим прикладом є завантаження веб-сторінки.
Коли ви перейшли на цю сторінку, ви натиснули посилання і чекали, поки сторінка завантажиться, і не змогли взаємодіяти з цією сторінкою або використовувати її, поки вона не закінчиться. На відміну від цього, якби ця сторінка мала подію AJAX (це асинхронна подія JavaScript та XML), пов’язану з якоюсь дією користувача, ця сторінка завантажувала б деякі дані з іншого джерела асинхронно - паралельно (теоретично) з будь-якими іншими діями, що відбуваються.
Приклад з двома синхронними подіями (A та B): Перший A щось робить. Коли A закінчено, B щось робить.
Приклад з двома асинхронними подіями (A і B): І A, і B роблять щось одночасно, і жодна подія не чекає іншої.
Ось приклад асинхронної операції в javascript (вам потрібно відкрити консоль javascript)
console.log('One!');
setTimeout(function(){console.log('Two!');},0);
//Doesn't wait
console.log('Three!');};
//OUTPUT:
//One!
//Three!
//Two!
Виклик до console.log('Two!')
буде виконаний без блокування решти коду, що відбувається після нього.
У реальному сценарії замініть setTimeout кимось, хто натискає кнопку на веб-сторінці. Відповідь на натискання кнопки відбудеться з часом, не блокуючи виконання інших кодів, таких як візуалізація сторінки.
Простіше кажучи, це означає щось, що відбувається через невідомий проміжок часу, тому не чекайте негайних результатів.
Наприклад, "Мамо, я можу отримати п’ять доларів?"
Простягаючи руку за гроші, я очікую, що вона негайно відповість, давши мені гроші (синхронно).
Реально, вона подивиться на мене хвилину чи дві, а потім вирішить відповісти, коли захоче (асинхронно).
Асинхронні події - це ті події, про які ми не знаємо, коли це відбудеться в майбутньому, наприклад, коли сервер запитується для якогось файлу, який ми не знаємо, коли він виконає наш запит, або події інтерфейсу користувача, які ми не знаємо, коли користувач буде клацніть на кнопку або інший елемент інтерфейсу, але, незважаючи на це, трапляються інші речі на сторінці або в програмі, він нічого не блокує, скажімо, що сторінка сірим кольором відображає весь інтерфейс, поки якийсь файл із сервера не з’являється або не відбувається якась подія це сила асинхронних подій, просто кажучи незалежних подій
Синхронні проти Асинхронні події
Деякі обробники подій викликаються негайно, коли подія відбувається. Вони називаються "синхронними" подіями. Прикладом є DocumentNew. Він викликається, як тільки користувач створює новий документ.
Однак деякі події викликаються незабаром після того, як подія настає, як правило, через невеликий проміжок часу. Вони називаються "асинхронними" подіями. Вони асинхронні, оскільки це призведе до дестабілізації Source Insight, якщо макрос, написаний користувачем, буде викликаний точно в той час, коли відбулася подія.
Якщо код синхронний (або синхронізований), це означає, що кожен шматок коду виконується послідовно, і наступний шматок коду не може виконуватися, доки попередній не буде завершено. Більшість кодів, як правило, синхронні.
Якщо код асинхронний (або асинхронний), це означає, що код може працювати окремо і незалежно від іншого коду. Якщо в середині зв’язку коду синхронізації є асинхронний код, у контексті цього конкретного питання асинхронний код буде запущений лише тоді, коли його подія ініційована, незалежно від того, де в коді синхронізації ви його помістили. Він повністю відокремлений і не залежить від коду синхронізації і працює, коли про це повідомляє його подія, а не лише тоді, коли попередній фрагмент коду закінчується. Деякі приклади цього можуть бути для коду, який працює із тимчасовим інтервалом, після успішного збереження файлу, після надсилання веб-запиту, коли користувач натискає кнопку або після завантаження зображення.