Як Javascript-код стає асинхронним при використанні зворотних дзвінків?


26

Я багато читав в Інтернеті, намагаючись зрозуміти, як написати асинхронний код JavaScript. Один із прийомів, який з’явився багато в моїх дослідженнях, - це використання зворотних зворотних дзвінків. Хоча я розумію процес написання та виконання функції зворотного виклику, я збентежений, чому, здається, зворотні виклики автоматично роблять виконання JavaScript асинхронним. Отже, моє запитання: як додавання функцій зворотного дзвінка до мого коду JavaScript робить зазначений код автоматично асинхронізованим?


2
Можливо, вам буде цікаво прочитати, як браузер досягає цього в одному потоці, написаний Джоном Ресігом
Jalayn

@Jalayn. Спасибі. Ваш коментар змінив значення, прочитавши кілька відповідей.
кушалвм

Відповіді:


26

Це не так. Просто прийняття зворотного дзвінка або передача зворотного дзвінка не означає, що це асинхронно.

Наприклад, .forEachфункція приймає зворотний дзвінок, але є синхронною.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

Зворотний setTimeoutдзвінок приймає теж асинхронний.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Приєднання до будь-якої асинхронної події в Javascript завжди вимагає зворотного дзвінка, але це не означає, що виклику функцій або передачі їх завжди є асинхронним.


2
@SteveEvers Я думаю, ви могли б відредагувати статтю MDN тоді. Зворотний виклик - це дуже поширений термін у javascript для будь-якої функції, переданої іншій, яка викликає вас назад за допомогою функції, яку ви надали ... навіщо ускладнювати це? Редагувати:
Відкликання дзвінків

3
@SteveEvers "зворотний виклик означає асинхронію" - це ідіосинкразія C # / Microsoft. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@MikeBrown Я думаю, що я занадто багато читав у його профілі, і це - найбільш відповідна відповідь, безумовно, дає уявлення про те, що "зворотні виклики означають асинхронність".
Esailija

1
Але те, що говорити @SteveEvers, також невірно. Відклики викликів не означають асинхронність, лише те, що хтось інший буде відповідати за "передзвонення".
Майкл Браун

1
+1, тому що Стів Еверс помиляється
slebetman

23

Секрет «магії» полягає в тому, що події, яким ви призначаєте зворотні дзвінки, є асинхронними. Вони реалізовані "під капотом", щоб дбати про все, що вони роблять (наприклад, витягування чогось з віддаленого сервера) у фоновому режимі, поза межами JS пісочниці. А потім, як тільки вони закінчать свою роботу, вони дають двигуну JS повідомлення про виклик події. Коли двигун JS закінчується тим, що він зараз робить, він викликає будь-які події, що стоять у черзі (або чекатимуть нового повідомлення), і тоді ваш зворотний дзвінок буде "магічно" викликатися асинхронно!

( ПРИМІТКА. Це концептуальний огляд теми на високому рівні, який не вникає в деталі, оскільки різні двигуни JS реалізовуватимуть речі по-різному. Але це загальне уявлення про те, як це працює.)


Які це події? Приклад однієї чи двох таких подій зробить вашу відповідь ще кращою.
Джо Смо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.