Єдине питання з обіцянками - IE не підтримує їх. Edge є, але IE 10 та 11 там: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (сумісність внизу)
Отже, JavaScript є однопоточним. Якщо ви не здійснюєте асинхронний дзвінок, він буде вести себе передбачувано. Основний потік JavaScript повністю виконає одну функцію перед виконанням наступної, у тому порядку, в якому вони відображаються в коді. Порядок гарантування синхронних функцій є тривіальним - кожна функція буде виконана повністю у тому порядку, в якому вона була викликана.
Подумайте про синхронну функцію як про атомну одиницю роботи . Основний потік JavaScript виконає його повністю, у тому порядку, в якому виписки відображаються в коді.
Але киньте асинхронний дзвінок, як у наступній ситуації:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Це не робить те, що ви хочете . Він миттєво виконує функцію 1, функцію 2 та функцію 3. Завантаження діва спалахує і вона пропала, в той час як виклик ajax майже не завершений, хоча makeAjaxCall()
повернувся. ЗАВДАННЯ полягає в тому, що makeAjaxCall()
вона розбила свою роботу на шматки, які поступово просуваються кожним закруткою основного потоку JavaScript закруткою - він веде себе асихронно. Але той самий основний потік під час одного відкручування / запуску виконував синхронні частини швидко та передбачувано.
Отже, як я впорався : Як я вже сказав, функція - це атомна одиниця роботи. Я поєднав код функції 1 і 2 - я поставив код функції 1 у функції 2, перед викликом асинхронізації. Я позбувся функції 1. Все, що стосується асинхронного виклику, виконується передбачувано, в порядку.
ТАКОЖ, коли асинхронний дзвінок завершується, після декількох обертів основного потоку JavaScript, він має функцію виклику 3. Це гарантує порядок . Наприклад, за допомогою ajax обробник подій onreadystateзмінюється викликом кілька разів. Коли він повідомляє, що він виконаний, то зателефонуйте до остаточної функції, яку ви хочете.
Я погоджуюсь, що це грязніше. Мені подобається, що код має симетричний характер, мені подобається, що функції виконують одне (або близько до нього), і мені не подобається, щоб виклик Ajax якимось чином не відповідав за показ (створюючи залежність від абонента). АЛЕ, при асинхронному виклику, вбудованому в синхронну функцію, потрібно робити компроміси, щоб гарантувати порядок виконання. І я повинен кодувати IE 10, щоб не обіцянки.
Короткий зміст : Для синхронних дзвінків гарантія порядку є тривіальною. Кожна функція виконується повністю в тому порядку, в якому вона викликалася. Для функції з асинхронним викликом єдиний спосіб гарантувати порядок - це відслідковувати завершення виклику асинхронізації та викликати третю функцію, коли цей стан виявлено.
Для обговорення потоків JavaScript див: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 та https://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
Також ще одне подібне, високо оцінене питання з цього приводу: Як я повинен викликати 3 функції, щоб виконувати їх одну за одною?
firstFunction
саме робить це, щоб зробити його асинхронним? У будь-якому випадку - перевірити обіцянки