Подтвердить что ты не робот

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

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

$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??

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

Спасибо :)

4b9b3361

Ответ 1

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

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

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

Относительно производительности .

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

Ответ 2

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

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

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

Итак,

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

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

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