Optimizing the Digest Cycle

AngularJS uses dirty checking in its “digest cycle.” For the uninitiated, you can read more about the digest cycle in the official docs and in this StackOverflow answer.

Sometimes, you want to be able to avoid a digest cycle. One common situation in real-time WebSocket’ed apps is that you don’t always want to digest when you receive a message. Consider a real-time game where messages are sent from the server 30 or more times per second.

app.factory('socket', function ($rootScope) {
  var socket = io.connect();
  return {
    on: function (eventName, callback) {
      socket.on(eventName, function () {  // this could fire many times a second
        var args = arguments;
        $rootScope.$apply(function () {
          callback.apply(socket, args);
        });
      });
    }
    // ...
  };
});

One great way to deal with this is to “throttle” the requests so a digest only happens a few times a second. Underscore.js provides such a function, but the implementation is pretty tiny, so I’ve reproduced it inside the socket service below:

app.factory('socket', function ($rootScope) {

  // Underscore.js 1.4.3
  // http://underscorejs.org
  // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
  // Underscore may be freely distributed under the MIT license.

  // _.throttle
  // https://github.com/documentcloud/underscore/blob/master/underscore.js#L626
  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time.
  var throttle = function (func, wait) {
    var context, args, timeout, result;
    var previous = 0;
    var later = function() {
      previous = new Date();
      timeout = null;
      result = func.apply(context, args);
    };
    return function() {
      var now = new Date();
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0) {
        clearTimeout(timeout);
        timeout = null;
        previous = now;
        result = func.apply(context, args);
      } else if (!timeout) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };
  };

  var socket = io.connect();
  return {
    on: function (eventName, callback) {
      socket.on(eventName, throttle(function () {  // limit to once every 500ms
        var args = arguments;
        $rootScope.$apply(function () {
          callback.apply(socket, args);
        });
      }, 500));
    }
    // ...
  };
});

Other times, you know an incoming change will only affect certain scopes, and might want to just dirty check those. For those cases, you can call$scope.$digest instead of $scope.$apply$digest will only run the digest cycle on the scope it’s called on, and all of that scope’s children.

Finally, to keep digest cycles short, watch expressions in $scope.$watch should be as fast as possible. Wherever possible, avoid deep comparisons. Remember, you only need to compare things that affect the view.

(Source: briantford.com)

(Reblogged from artinmycoffee)

Ночью на улице очень красиво. Тишина…

Использование стандартизированных способов коммуникаций ведет к значительной утрате смысловой полноты общения
из книги «Философия и методологии науки»
Обычное чудо в домашних условиях

Обнаружил в кладовке прошлогоднюю крещенскую воду в закрытой пятилитровой бутылке. На стенках бутылки образовался зеленоватый налет. Открыл. Никакого запаха. Налил в стакан, выпил — вкуснейшая вода, как из родника, с удовольствием допиваю ее теперь.&#160;: )

Обычное чудо в домашних условиях

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

Доброе утро!
Снежок выпал, на улице очень красиво! Сугробчики, мммм! =)

О числе 666

И он сделает то, что всем, малым и великим, богатым и нищим, свободным и рабам, положено будет начертание на правую руку их или на чело их, и что никому нельзя будет ни покупать, ни продавать, кроме того, кто имеет это начертание, или имя зверя, или число имени его. Здесь мудрость. Кто имеет ум, тот сочти число зверя, ибо это число человеческое; число его шестьсот шестьдесят шесть. (Откр. 13)

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

Разница между католиками и православными

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

Католицизм религия разума, православие религия сердца

В понедельник был день памяти Василия Великого, я в прошлом году впервые почитал его жизнеописание, оно произвело на меня сильное впечатление, с тех пор я очень полюбил этого святого. Вот то житие которое я читал.
http://cl.ly/0A0m011R1L3x

В понедельник был день памяти Василия Великого, я в прошлом году впервые почитал его жизнеописание, оно произвело на меня сильное впечатление, с тех пор я очень полюбил этого святого. Вот то житие которое я читал. http://cl.ly/0A0m011R1L3x