Для тих, хто будує складні програми, пам’ятайте, що на ваш вибір впливає ефективність роботи. Також я хотів би доповнити Марк відповідь більш детальними технічними деталями:
$ timeout (зворотний виклик) чекатиме завершення поточного циклу дайджесту (тобто, кутове оновлення всієї моделі та DOM), тоді він виконає зворотний виклик - потенційно впливає на кутову модель - потім запустить повний $apply
корінь в області root $ і перенаправить все.
$ evalAsync (зворотний виклик) , з іншого боку, додасть зворотний виклик до поточного або наступного циклу дайджесту. Що означає, що якщо ви знаходитесь у циклі дайджесту (наприклад, у функції, яка викликається з якоїсь ng-click
директиви), це нічого не чекатиме, код буде виконуватися відразу. Якщо ви знаходитесь в асинхронному дзвінку, наприклад, a setTimeout
, $apply
буде запущений новий цикл дайвінгу ( ).
Тож щодо продуктивності завжди краще зателефонувати $evalAsync
, якщо тільки для вас не важливо, щоб перегляд був оновлений перед виконанням вашого коду, наприклад, якщо вам потрібен доступ до якогось атрибута DOm, такого як ширина елементів тощо.
Якщо ви хочете отримати детальнішу інформацію про відмінність між $ timeout, $ evalAsync, $ digest, $ apply, я запрошую вас прочитати мою відповідь на це інше питання: https://stackoverflow.com/a/23102223/1501926
Також обов’язково прочитайте документацію :
$ EvalAsync не дає гарантій щодо того, коли буде виконуватися вираз, лише це:
- він буде виконуватися після функції, яка запланувала оцінку (бажано до надання DOM).
- принаймні один цикл дайджестів $ буде виконано після виконання виразу.
Примітка: якщо ця функція викликається поза циклом перетворення $, буде заплановано новий цикл перебору $ . Однак рекомендується завжди код виклику, який змінює модель зсередини виклику $ застосовувати. Це включає код, оцінений за допомогою $ evalAsync.