разница между setTimeout в javascript и сервисом $timeout в angularjs

Я новичок в angular framework. Вот мой сценарий, в котором я хочу изменить свою переменную $scope.variable через некоторое время, поэтому я использовал метод javascript setTimeout.

$scope.variable = 'Previous';

setTimeout(function(){
  $scope.variable='NEXT';
},3000);

Этот код не работает для меня. Я использовал $apply(), чтобы заставить этот код работать.

Позже я узнал, что у самого angular есть служба $timeout, которая выполняет ту же работу.

$scope.variable = 'Previous';

$timeout(function () {
  $scope.variable = 'NEXT';
}, 2000);

Как я могу сравнить производительность сервиса $timeout с javascript setTimeout??

Почему мы должны использовать $timeout вместо setTimeout??

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

Спасибо :)


person Ravi Teja Kumar Isetty    schedule 03.09.2016    source источник
comment
Производительность полностью зависит от производительности цикла дайджеста в текущем приложении. $timeout вызовет дайджест. Для приложения со значительным количеством наблюдателей, где $rootScope.$digest() приводит к зависанию приложения, оно зависнет еще раз. Это так просто.   -  person Estus Flask    schedule 04.09.2016


Ответы (2)


В некоторых случаях необходимо выполнить какую-то операцию тайм-аута, и мы часто добиваемся этого с помощью функции JavaScript setTimeout().

Однако, если мы используем setTimeout() в приложении AngularJS, нам также необходимо использовать $scope.$apply(), чтобы гарантировать, что любые изменения в scope будут отражены в другом месте (т.е. привязаны к данным в view).

AngularJS предоставляет удобную оболочку для этого: $timeout() - он выполняет $apply() изменения, для которых нам не нужно $apply вносить изменения.

Что касается производительности.

Если вы используете $timeout для создания того, что по сути является интервалом, не используйте его. Если ваше приложение большое, то $apply также вызовет цикл $digest, который вы, возможно, не хотите, чтобы это произошло, это, безусловно, снизит производительность.

person Nikhilesh Shivarathri    schedule 03.09.2016

Любая переменная области видимости AngularJS при обработке извне (включая ajax) нуждается в $apply().

$timeout() заботится о текущей области и запускается в том же цикле дайджеста после того, как все обнаружение изменений выполнено.

Одна прелесть $timeout(), которую я недавно обнаружил, заключается в том, что если вы не передадите параметр времени, он будет ждать завершения DOM.

So,

$timeout(function(){
  console.log("show after directive partial loaded")
}); //note, no time parameter

Запустите этот код в директиве, и функция обратного вызова тайм-аута будет запущена, как только часть будет загружена директивой.

Надеюсь это поможет.

person Tarun    schedule 03.09.2016
comment
Кроме того, вы можете передать false в качестве второго параметра $timeout, и это не вызовет $apply. Полезно, когда вы хотите управлять $digest вручную - person Ladmerc; 03.09.2016
comment
Ответ расплывчатый в деталях и, возможно, содержит неверную информацию. Утверждение об использовании директивы надумано и не объясняет, чем она отличается от setTimeout+$scope.$apply. $timeout(() => {... }, ...) по сути такой же, как setTimeout(() => $scope.$apply(..), ...), за исключением того факта, что первый можно тестировать синхронно с $timeout.flush() (также у него есть возможность пропустить дайджест). - person Estus Flask; 04.09.2016