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

KnockoutJS: рассчитано против pureComputed

Какая разница между computed и pureComputed в KnockoutJS?

Можно ли безопасно использовать pureComputed вместо computed?

4b9b3361

Ответ 1

Я согласен с @Jeroen, и я хотел бы добавить короткий пример из книги Дж. Мунро, которая очень помогла мне, поэтому это может быть полезно и для других.

Прежде всего, pureComputed наблюдаемые аналогичны вычислениям с несколькими улучшениями производительности и памяти. Имя заимствовано из термина программирования функции Pure, и это означает, что любая функция, которая использует только локальную переменную, потенциально чиста, тогда как любая функция, использующая нелокальную переменную, потенциально нечиста.

Наблюдаемые в Knockout.js трактуются по-разному. Таким образом, pureComputed наблюдаемые помещаются в спящий режим (нокаут склоняет все зависимости и повторно оценивает содержимое, когда после чтения), а вычисленные наблюдаемые помещаются в режим прослушивания (нокаут постоянно проверяет, соответствует ли значение первому до первого доступа),

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

function ViewModel() {
     var self = this;

     self.firstName = ko.observable('Arshile');
     self.lastName = ko.observable('Gorky');
     self.pureComputedExecutions = 0;
     self.computedExecutions = 0;

     self.pureComputedFullName = ko.pureComputed(function() {
         // This is NOT recommended 
         self.pureComputedExecutions++;
         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
     self.computedFullName = ko.computed(function() {
         self.computedExecutions++;

         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
 };
 var viewModel = new ViewModel();
 ko.applyBindings(viewModel);

 alert('Pure computed executions: ' + viewModel.pureComputedExecutions);
 alert('Computed executions: ' + viewModel.computedExecutions);

Когда этот код запущен, отображаются два предупреждающих сообщения, которые показывают количество раз, когда вызываются функции pureComputed и вычисляемые функции. Поскольку pureComputed находится в спящем режиме, функция никогда не была доступна, а счетчик wil отображает 0. В отличие от этого, вычисленная функция автоматически оценивается по привязке данных, заставляя счетчик увеличивать число и отображать 1.

Ответ 2

Они очень похожи. Разница заключается в том, что pureComputed имеет некоторые оптимизации производительности и пытается предотвратить утечку памяти, будучи умным о том, кто отслеживает его изменения.

Вы можете безопасно заменить computed на pureComputed во многих случаях. Функция внутри вычисленного должна следовать этому:

1.Оценка вычисленного наблюдаемого не должна вызывать побочных эффектов.

2. Значение вычисленного наблюдаемого не должно меняться в зависимости от количества оценок или другой "скрытой" информации. Его значение должно основываться исключительно на значениях других наблюдаемых в приложении, которые для определения чистой функции считаются ее параметрами.

Итак, как правило, любое вычисляемое наблюдаемое, которое просто трансформирует некоторые регулярные свойства observable, должно быть точным как pureComputed, в противном случае придерживаться computed.

В документации есть приличные объяснения того, когда/почему вы не должны использовать pureComputed наблюдаемые. Вот соответствующий отрывок:

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

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