2012-05-14 32 views
7

nếu chúng ta vượt qua true cho cache trong $.ajax() các jquery sẽ cache dữ liệu được nạp, Tôi muốn biết có cách nào để thay đổi thời gian bộ nhớ cache cho $.ajax()? ví dụ nếu ajax yêu cầu trong 10 phút tải dữ liệu trước đó jquery nhưng nếu được yêu cầu sau 10 phút tải dữ liệu mới.Thay đổi thời gian bộ nhớ cache trong jquery

UPDATE:

Chúng ta cần bộ nhớ cache dữ liệu JSON, vì vậy tôi nên sử dụng Ajax trong JSON datatype

+1

Đặt tiêu đề bộ nhớ cache trên máy chủ trong 10 phút. – epascarello

+0

Dường như có một số thông tin quan trọng còn thiếu trong câu hỏi này bằng cách đọc câu trả lời của Vincent. Dường như bạn đang thực hiện cuộc gọi AJAX trên tài nguyên HTML và mong đợi kết quả dưới dạng JSON \ -: – hippietrail

Trả lời

4

jQuery không thực sự cache yêu cầu cho bạn - khi bạn thiết cache-false, nó chỉ đơn giản là bộ một số tiêu đề và chuyển biến chuỗi truy vấn "cache buster" (ví dụ: ?_=487262189472) để ngăn trình duyệt hoặc bất kỳ proxy nào trả về phản hồi được lưu trong bộ nhớ cache.

Nếu bạn muốn bộ nhớ đệm trong 10 phút, bạn có thể triển khai bộ nhớ cache khá dễ dàng. Ví dụ:

var cacheBuster = new Date().getTime(); 
setInterval(function() { 
    cacheBuster = new Date().getTime(); 
}, 1000 * 60 * 10) 

Sau đó, chỉ cần thêm biến đó vào biến chuỗi truy vấn theo yêu cầu của bạn (ví dụ: ?_noCache=<cacheBuster>).


Chỉnh sửa: vì lợi ích của việc này là một giải pháp hoàn thiện hơn, đây là một ví dụ về cách bạn có thể sử dụng cacheBuster trên tất cả các yêu cầu jQuery Ajax một cách minh bạch để các cuộc gọi Ajax thực tế:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    var startChar = options.url.indexOf('?') === -1 ? '?' : '&'; 
    options.url += startChar + '_noCache=' + cacheBuster; 
}); 
+0

Bạn có biết các trường hợp không thực sự hoạt động và vẫn sẽ tìm nạp yêu cầu mới cho máy chủ không? – vsync

2

này âm thanh như một sân chơi lý tưởng để tận dụng đối tượng Trì hoãn của jQuery.

Có một bài viết tuyệt vời bởi Addy Osmani và Julian Aubourg trên MSDN ở đây: http://msdn.microsoft.com/en-us/magazine/gg723713.aspx

trong ngắn hạn, họ có một ví dụ có giải thích cách chúng lưu trữ các yêu cầu, yêu cầu này đặc biệt sẽ được lưu trữ mãi mãi.

var cachedPromises = {}; 

$.getCachedURL = function(url, callback) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

và sau đó giải quyết thu nhập hoãn lại như vậy

$.getCachedURL(url).then(successCallback, errorCallback); 

vì vậy nếu bạn muốn url nào đó để được lưu trữ trong một thời gian nhất định chúng tôi có thể sửa đổi mã hiện và làm điều gì đó dọc theo dòng (lưu ý rằng đây là ra khỏi đỉnh đầu của tôi)

var cachedPromises = {}; 
var cachedTimeouts = {}; 

$.getCachedURL = function(url, callback, cacheTime) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
     cachedTimeouts[ url ] = setTimeout(function() { 
      clearTimeout(cachedTimeouts[ url ]); 
      delete cachedPromises[ url ]; 
     }, cacheTime); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

và sử dụng một callback:

var callback = function() { 
    console.log('callback', arguments) 
} 

var cacheTime = 3600; 

$.getCachedURL('/dynamic/config', callback, cacheTime).then(function() 
{ 
    console.log('success', arguments) 
}, function() 
{ 
    console.log('error', arguments) 
}); 

nơi gọi lại sẽ trở lại với jQuery ajax luận succes/lỗi truyền thống data, textStatusjqXHR

nếu bạn muốn JSON sử dụng $.getJSON thay vì $.get

$.get(url).then(defer.resolve, defer.reject); 
$.getJSON(url).then(defer.resolve, defer.reject); 

lưu ý rằng bạn vẫn có thể chỉ cần sử dụng $.ajax

$.ajax({ 
    url: url, 
    dataType: 'json', 
}).then(defer.resolve, defer.reject); 
+0

Cảm ơn bạn, nhưng tôi muốn lấy dữ liệu JSON, chức năng này không chuyển dữ liệu JSON đến số gọi lại – MajAfy

+0

Tôi đã cập nhật câu trả lời của tôi với một ví dụ bổ sung cho bạn thấy cách thức và thông tin được trả lại. Tôi cũng đã sửa một số cú pháp, vì vậy hãy sao chép lại ví dụ. –

+0

cảm ơn, các đối số trong gọi lại là HTML, chúng ta cần JSON, tôi nghĩ chúng ta nên thay đổi hàm '$ .getCachedURL' – MajAfy

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