2014-07-23 11 views
12

Próbuję buforować wynik z wywołania ajax przy użyciu funkcji memoize z Underscore.js. Nie jestem pewien co do mojej implementacji. Również, jak odzyskać dane wynikowe z pamięci podręcznej za pomocą klucza. Poniżej jest moje wykonanie:przy użyciu funkcji memoize z underscore.js

kod JavaScript:

var cdata = $http 
.get(HOST_URL + "/v1/report/states") 
.success(function(data) { 
    //put the result in the angularJs scope object. 
    $scope.states = data; 
}); 

//store the result in the cache. 
var cachedResult = _.memoize(
    function() { 
     return cdata; 
    }, "states"); 

Czy mój wykorzystanie memoize aby zapisać wynik AJAX jest prawidłowe. Również po umieszczeniu w pamięci podręcznej, jak odzyskać na podstawie klucza. tj. "stany".

Odpowiedz

30

Pozwól nam zrozumieć, w jaki sposób _.memoize prace, trwa funkcję, która musi być memoized jako pierwszy argument i buforuje wynik powrotu funkcji dla danego parametru. Następnym razem, gdy wywołana funkcja zostanie wywołana z użyciem tego samego argumentu, użyje wyniku z pamięci podręcznej i można uniknąć czasu wykonania tej funkcji. Dlatego bardzo ważne jest, aby skrócić czas obliczeń.

Jak wspomniano, powyższa funkcja fibonaci, którą zapamiętał, działa doskonale, ponieważ argument ma typ pierwotny.

Problem występuje, gdy trzeba zapamiętać funkcję, która akceptuje obiekt. Aby rozwiązać ten problem, _.memoize akceptuje opcjonalny argument hashFunction, który będzie używany do mieszania danych wejściowych. W ten sposób można jednoznacznie identyfikować obiekty za pomocą własnych funkcji skrótu.

Domyślna implementacja _.memoize (przy użyciu domyślnej funkcji skrótu) zwraca pierwszy argument w obecnej postaci - w przypadku JavaScript zwróci [Object object].

Tak np.

var fn = function (obj){ some computation here..} 
var memoizedFn = _.memoize(fn); 

memoizedFn({"id":"1"}) // we will get result, and result is cahced now 

memoizedFn({"id":"2"}) // we will get cached result which is wrong 

dlaczego domyślny ma funkcję w _.memoize jest funkcją (x) {x} Powrót

problemu można uniknąć przez przepuszczanie funkcji mieszającej

_.memoize(fn, function(input){return JSON.stringify(input)}); 

Było to prawdziwe pomocą mi kiedy to za pomocą _.memoize do funkcji, która była praca z argumentami tablic.

Mam nadzieję, że pomaga to wielu osobom w ich pracy.

+0

Naprawiono błędy gramatyczne i dodano dodatkowe informacje. –

5

_.memoize wykonuje funkcję:

var fibonacci = _.memoize(function(n) { 
    return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2); 
}); 

Należy zrozumieć, że jest to tylko dodatkowa funkcja otoki sprawia, że ​​funkcja, która je przekazać jako argument mądrzejszego (dodaje dodatkowy przedmiot mapowania do niego).

W powyższej przykładowej funkcji, która oblicza liczbę Fibonacciego, jest zawijana za pomocą _.memoize. Tak więc dla każdej funkcji wywołanie (fibonacci(5) lub fibonacci(55555)) przekazało argument dopasowany do wartości zwracanej, więc jeśli potrzebujesz wywołać jeszcze raz fibonacci(55555), nie trzeba go ponownie obliczać. Po prostu pobiera tę wartość z tego obiektu odwzorowania, który został dostarczony wewnętrznie.

-1

Jeśli używasz $http Angula.js, prawdopodobnie chcesz przekazać {cache : true} jako drugi parametr metody get.

Aby przechowywać wartości za pomocą par klucz-wartość, można użyć $cacheFactory, jak opisano w innych odpowiedziach, takich jak here. Zasadniczo:

var cache = $cacheFactory('cacheId'); 
cache.put('states', 'value'); 
cache.get('states'); 
Powiązane problemy