2014-07-23 14 views
12

Tôi đang cố gắng lưu kết quả từ cuộc gọi ajax bằng cách sử dụng chức năng memoize từ Underscore.js. Tôi không chắc về triển khai của mình. Ngoài ra làm thế nào để lấy lại dữ liệu kết quả được lưu trữ bằng cách sử dụng khóa. Dưới đây là thực hiện của tôi:sử dụng chức năng ghi nhớ với underscore.js

javascript mã:

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

là sử dụng của tôi của memoize để lưu trữ các kết quả của ajax là chính xác. Ngoài ra một khi nó được đặt trong bộ nhớ cache, làm thế nào để lấy dựa trên khóa. tức là 'tiểu bang'.

Trả lời

30

Chúng ta hãy hiểu làm thế nào _.memoize công trình, phải mất một chức năng mà cần phải được memoized như là đối số đầu tiên và lưu trữ kết quả của sự trở lại chức năng cho tham số nhất định. Lần sau nếu chức năng memoized được gọi với cùng một lý lẽ nó sẽ sử dụng kết quả được lưu trữ và thời gian thực hiện cho các chức năng có thể tránh được. Vì vậy, nó rất quan trọng để giảm thời gian tính toán.

Như đã đề cập, hàm fibonaci ở trên nó ghi nhớ các tác phẩm hoàn toàn ổn định khi đối số có kiểu nguyên thủy.

Sự cố xảy ra khi bạn phải ghi nhớ một hàm chấp nhận đối tượng. Để giải quyết việc này, _.memoize chấp nhận một đối số tùy chọn hashFunction đó sẽ được dùng để băm đầu vào. Bằng cách này bạn có thể xác định duy nhất đối tượng của bạn với hàm băm của riêng bạn.

Việc triển khai mặc định _.memoize (sử dụng hàm băm mặc định) trả về đối số đầu tiên vì nó là - trong trường hợp JavaScript, nó sẽ trả về [Object object].

Vì vậy, ví dụ:

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 

lý do mặc định có chức năng trong _.memoize là function (x) {return x}

vấn đề có thể tránh được bằng cách thông qua một hàm băm

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

Đây là một sự giúp đỡ thực sự cho tôi khi tôi còn sử dụng _.memoize cho một chức năng đó là làm việc trên các đối số mảng.

Hy vọng điều này sẽ giúp nhiều người trong công việc của họ.

+0

Sửa một số lỗi ngữ pháp và thêm một số thông tin bổ sung. –

5

_.memoize mất một chức năng:

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

Bạn nên hiểu rằng đây chỉ là một chức năng wrapper bổ sung mà làm cho chức năng mà bạn vượt qua nó như một tham số thông minh hơn (Thêm thêm đối tượng lập bản đồ với nó).

Trong ví dụ trên hàm tính số fibonacci được bọc xung quanh với _.memoize. Vì vậy, trên tất cả các chức năng cuộc gọi (fibonacci(5) hoặc fibonacci(55555)) thông qua lập luận phù hợp để trả lại giá trị vì vậy nếu bạn cần phải gọi thêm một lần nữa fibonacci(55555) nó không cần phải tính toán lại. Nó chỉ lấy về mà giá trị từ đối tượng lập bản đồ mà _.memoize cung cấp nội bộ.

-1

Nếu bạn đang sử dụng $http của Angular.js, bạn có thể chỉ muốn chuyển {cache : true} làm tham số thứ hai cho phương thức get.

Để lưu giá trị bằng cặp giá trị khóa, bạn có thể muốn sử dụng $cacheFactory, như được mô tả trong các câu trả lời khác như here. Về cơ bản:

var cache = $cacheFactory('cacheId'); 
cache.put('states', 'value'); 
cache.get('states'); 
Các vấn đề liên quan