2015-01-02 19 views
5

Dịch vụ của tôi cần truy xuất giá trị không đồng bộ, nhưng khi tôi có nó, tôi muốn sử dụng phiên bản được lưu trong bộ nhớ cache của giá trị. Khi hai bộ điều khiển gọi dịch vụ này, tôi muốn người đầu tiên lưu trữ giá trị đã truy xuất và giá trị thứ hai sử dụng giá trị được lưu trong bộ nhớ cache, nhưng theo nhật ký, tôi không bao giờ tìm thấy giá trị được lưu trong bộ nhớ cache. Khi điều này chạy, tôi thấy một thông điệp tường trình cho thấy giá trị được lưu trữ, sau đó, khi tôi đi theo một tuyến đường góc tới một bộ điều khiển khác, tôi không thấy dịch vụ tìm thấy giá trị được lưu trong bộ nhớ cache. Tại sao nó không chạy theo mong đợi của tôi ** **Bộ nhớ cache dịch vụ góc có giá trị

angular.module('myApp.services').factory('Config', function() { 

    var Config = { }; 

    Config.currentYear = function() { 
     if (Config._currentYear) { 
      // sadly, we never execute here 
      console.log("returning cached year"); 
      return Parse.Promise.as(Config._currentYear); 
     } 
     return Parse.Config.get().then(function(config) { 
      console.log("caching year"); 
      Config._currentYear = config.get("currentYear"); 
      return Config._currentYear; 
     }); 
    }; 

    return Config; 

}); 

Một vài ghi chú: (1) Tôi tên là thuộc tính _currentYear lưu trữ, thêm dấu gạch dưới để tránh va chạm với các tên hàm. Không chắc tôi có cần làm thế không. (2) Tôi trả lời một lời hứa hoàn thành khi giá trị được lưu trữ, vì vậy hàm luôn trả về một lời hứa ... cũng không chắc chắn nếu cần thiết, nhưng con số nó không thể bị tổn thương.

+2

Vậy vấn đề chính xác là gì? – dfsq

+0

Được nêu trong câu hỏi ngay bên dưới mã. Tôi đã chuyển phần câu hỏi phía trên mã số – user1272965

+0

Đã kiểm tra các câu hỏi tương tự khác? http://stackoverflow.com/questions/15100020/using-angular-service-to-share-data-between-controllers – ochi

Trả lời

3

Thay vì lưu vào bộ nhớ cache dữ liệu, tại sao bạn không lưu lại lời hứa và trả lại. Khi bạn lưu trữ dữ liệu, bạn đang đặt dữ liệu Config._currentYear chỉ trong lần gọi lại thành công và có khả năng các (các) cuộc gọi tiếp theo khác xảy ra trước khi cuộc gọi lại thành công được chạy. Vì vậy, bạn sẽ thực hiện lại cuộc gọi đó. Bạn có thể dễ dàng thấy điều này khi bạn có các cuộc gọi được thực hiện cho cùng một phương thức dịch vụ từ các bộ điều khiển khác nhau được khởi tạo, bởi sự hiện diện của chúng trên cùng một mẫu. Caching một lời hứa trả trước sẽ tránh những vấn đề này.

angular.module('myApp.services').factory('Config', function() { 
    var config; //Just use to save the promise 
    Config.currentYear = function() { 
     /*If there is already a call made before return the promise else 
      make the actual call and store the promise in the variable.*/ 
     return config || config = Parse.Config.get().then(function(config) { 
      return config.get("currentYear"); 
     }); 
    }; 
}); 
+2

1) cảm ơn câu trả lời, 2) ý tưởng tuyệt vời để lưu lại lời hứa để tránh tình trạng cuộc đua (tôi cũng sẽ sử dụng nó ở những nơi khác), 3) Tôi phát hiện ra rằng vấn đề của tôi phải làm với các nút dấu ngoặc đơn adobe máy chủ (khi tôi chạy một cách thủ công, nó đã hoạt động), nhưng tôi sẽ đánh dấu điều này là chính xác vì nó hữu ích (và không có ý nghĩa về việc đặt các dấu hỏi trong câu hỏi). – user1272965

+0

@ user1272965 Bạn được hoan nghênh. Vui mừng vì nó giúp đỡ. Một điều nữa bạn có thể thêm là để vô hiệu hóa lời hứa đã lưu trong khối catch. Chỉ cần bạn không luôn luôn giữ lời hứa thất bại trong bộ nhớ cache. Và có caching lời hứa làm giảm số lượng lót mã mà nếu không bạn phải làm khi bộ nhớ đệm dữ liệu, sau khi tất cả lời hứa chỉ là một proxy cho dữ liệu. – PSL

+0

@ user1272965 Tôi xin lỗi nếu bạn nghĩ rằng tôi (và những người khác) đang bị lừa đảo. Điều này có vẻ như vậy đối với bạn, nhưng nó chỉ đơn thuần là bởi vì chúng tôi đã thực hiện một số kinh nghiệm khi mọi người không rõ ràng đã hỏi vấn đề của họ là gì và mọi người dành thời gian (vô dụng) để giải quyết một vấn đề không tồn tại. Vì vậy, được _very_ rõ ràng ở đây là hy vọng và tôi hy vọng bạn không nhận được thiên vị chống lại cộng đồng SO. Nhưng tôi vui vì PSL cũng nghĩ rằng tình trạng cuộc đua là cốt lõi của vấn đề :) – dirkk

Các vấn đề liên quan