Выполнение обещаний без цикла дайджеста

По-видимому, обещания AngularJS связаны с циклом дайджеста, так как обратные вызовы об успехе / ошибке не вызываются до тех пор, пока не будет выполнен цикл дайджеста. Это означает, что все, что использует обещания, такие как $http или созданные вручную обещания, также необходимо запустить цикл дайджеста, чтобы запустить обратные вызовы.

Можно ли использовать обещания в Angular, без выполнения цикла дайджеста? Я понимаю, что вы можете использовать $applyAsync, который планирует цикл дайджеста на чуть позже, но я смотрю, чтобы вообще не запускать цикл дайджеста, и все еще имею then обратные вызовы запускаются.

По сути, я пытаюсь понять, как выжать как можно больше производительности из приложения, которое будет использовать довольно много асинхронного поведения, которое потребует разрешения обещаний, но не обязательно выполнения цикла дайджеста.

1 ответ

Решение

Нет, в настоящее время это невозможно. Всякий раз, когда then обработчик запускает расписание обратного вызова через $evalAsync который планирует дайджест, если он еще не запланирован.

Исключением является $timeout который принимает дополнительный аргумент, чтобы не запускать дайджест. С другой стороны - несколько обещаний, которые разрешаются в один и тот же ход, выполняются в одном и том же дайджесте.

Ваши варианты: - Использовать XMLHttpRequqest напрямую, серьезно - это не очень сложно. Самым большим недостатком этого является то, что он не будет учитывать перехватчики и другие хуки $http (например, фиктивный бэкэнд). - Украсить $q не планировать через $evalAsync или добавить .thenNoDigest метод к обещанию прототипа, который планирует через setTimeout, - Используйте библиотеку обещаний пользовательского пространства вместо $q для $http или более XHR.

Другие вопросы по тегам