3

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

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

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

+0

Действительно ли вы определили, что цикл дайджеста имеет стоимость исполнения? Отсрочка вызова продолжения является фундаментальным свойством обещаний и не кажется дорогостоящей в других реализациях (я не знаю обещаний AngularJS). –

+0

@dystroy Я не определил, что он имеет очень высокую производительность, поскольку приложение еще не существует. Однако, даже если это занимает 10 мс (и в предыдущих приложениях они могут занимать больше времени), и у меня есть 10 обещаний, разрешающих через 1 секунду (каждый из которых инициируется отдельными событиями), что заканчивается 100 мс времени, затраченного в секунду на ненужный дайджест что кажется, что он может войти на территорию пользователя, способного заметить, тем более что он сокращает время, доступное для другой обработки. –

+0

Итак, используйте местные обещания. – dfsq

ответ

3

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

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

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

+0

Использование чего-то другого, кроме '$ q', похоже на наиболее вероятный вариант. – Adam

+1

@ Адам честно, я не уверен, что есть много случаев, когда дайджесты стоят дороже, чем сетевые запросы. –