Выполнение обещаний без цикла дайджеста
По-видимому, обещания AngularJS связаны с циклом дайджеста, так как обратные вызовы об успехе / ошибке не вызываются до тех пор, пока не будет выполнен цикл дайджеста. Это означает, что все, что использует обещания, такие как $http
или созданные вручную обещания, также необходимо запустить цикл дайджеста, чтобы запустить обратные вызовы.
Можно ли использовать обещания в Angular, без выполнения цикла дайджеста? Я понимаю, что вы можете использовать $applyAsync
, который планирует цикл дайджеста на чуть позже, но я смотрю, чтобы вообще не запускать цикл дайджеста, и все еще имею then
обратные вызовы запускаются.
По сути, я пытаюсь понять, как выжать как можно больше производительности из приложения, которое будет использовать довольно много асинхронного поведения, которое потребует разрешения обещаний, но не обязательно выполнения цикла дайджеста.
1 ответ
Нет, в настоящее время это невозможно. Всякий раз, когда then
обработчик запускает расписание обратного вызова через $evalAsync
который планирует дайджест, если он еще не запланирован.
Исключением является $timeout
который принимает дополнительный аргумент, чтобы не запускать дайджест. С другой стороны - несколько обещаний, которые разрешаются в один и тот же ход, выполняются в одном и том же дайджесте.
Ваши варианты:
- Использовать XMLHttpRequqest напрямую, серьезно - это не очень сложно. Самым большим недостатком этого является то, что он не будет учитывать перехватчики и другие хуки $http (например, фиктивный бэкэнд).
- Украсить $q
не планировать через $evalAsync
или добавить .thenNoDigest
метод к обещанию прототипа, который планирует через setTimeout
, - Используйте библиотеку обещаний пользовательского пространства вместо $q для $http или более XHR.