Pregunta KnockoutJS: calculado frente a puroComputado


Cuál es la diferencia entre computed y pureComputed en KnockoutJS?

Puedo usar pureComputed en lugar de computed ¿sin peligro?


32
2018-05-19 04:47


origen


Respuestas:


Estoy de acuerdo con @Jeroen y me gustaría agregar un pequeño ejemplo de J. Munro libro que me ayudó mucho, así que esto podría ser útil para otros también.

En primer lugar, los observados puros son bastante similares a los observables calculados con varias mejoras de rendimiento y memoria. El nombre es tomado de la Función pura término de programación y significa que cualquier función que use solo variables locales es potencialmente pura, mientras que cualquier función que use una variable no local es potencialmente impura.

Los observables en Knockout.js se tratan de manera diferente. Así, los observables puros se colocan en modo de suspensión (Knockout inclina todas las dependencias y vuelve a evaluar el contenido cuando se lee) y los observables computados se colocan en modo de escucha (Knockout comprueba constantemente si el valor está actualizado antes del primer acceso) .

Por lo tanto, si necesita ejecutar otro código, entonces es mejor usar un observables computados.

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);

Cuando se ejecuta este código, se muestran dos mensajes de alerta que muestran la cantidad de veces que se invocan las funciones compiladas y purificadas. Como pureComputed está en modo de suspensión, nunca se ha accedido a la función y el contador mostrará 0. A diferencia de esto, la función calculada se evalúa automáticamente en el enlace de datos, lo que hace que el contador incremente el número y muestre 1.


17
2017-07-31 14:15



Son muy similar. La diferencia es ese pureComputed tiene algunas optimizaciones de rendimiento e intenta evitar fugas de memoria al ser inteligente sobre quién está rastreando sus cambios.

Usted puede reemplazar de manera segura computed con pureComputed en muchos casos. La función dentro de la calculada debería seguir esto:

1.Evaluar el observable calculado no debería causar ningún efecto secundario.

2. El valor del observable calculado no debe variar en función del número de evaluaciones u otra información "oculta". Su valor debe basarse únicamente en los valores de otros observables en la aplicación, que para la definición de función pura se consideran sus parámetros.

Entonces, como regla general, cualquier observable calculado que simplemente transforme observable las propiedades deberían estar bien como pureComputed, de lo contrario, quédate con computed.

La documentación tiene explicaciones decentes de cuándo / por qué deberías no utilizar pureComputed observables. Aquí hay un extracto relevante:

No debe usar la característica pura para un observable calculado que está destinado a realizar una acción cuando cambian sus dependencias.

La razón por la que no debe usar un cálculo puro si el evaluador tiene efectos secundarios importantes es simplemente que el evaluador no se ejecutará siempre que el computador no tenga suscriptores activos (y por lo tanto esté durmiendo). Si es importante que el evaluador se ejecute siempre cuando cambian las dependencias, utilice un cálculo ordinario en su lugar.


25
2018-05-19 06:05