2012-01-12 58 views
63

jQuery.get() là viết tắt của jQuery.ajax() khi nhận cuộc gọi. Nhưng khi tôi đặt cache:false trong dữ liệu của cuộc gọi .get(), những gì được gửi tới máy chủ là thông số được gọi là bộ nhớ cache có giá trị sai. Trong khi ý định của tôi là gửi một dấu thời gian với dữ liệu đến máy chủ để ngăn chặn bộ nhớ đệm đó là những gì sẽ xảy ra nếu tôi sử dụng cache: false trong dữ liệu jQuery.ajax. Làm cách nào để thực hiện điều này mà không cần viết lại các cuộc gọi jQuery.get của tôi tới các cuộc gọi jQuery.ajax hoặc sử dụngCách đặt bộ nhớ cache: false trong lời gọi jQuery.get

$.ajaxSetup({ 
    // Disable caching of AJAX responses 
    cache: false 
}); 

Cập nhật: Cảm ơn mọi người đã trả lời. Tất cả các bạn đều đúng. Tuy nhiên, tôi đã hy vọng rằng có một cách để gọi get biết rằng bạn không muốn cache, hoặc gửi giá trị đó tới .ajax() để nó biết phải làm gì với nó.

I a. tìm kiếm một cách thứ tư khác với ba cách đã được xác định cho đến nay:

  1. Làm nó trên toàn cầu thông qua ajaxSetup

  2. Sử dụng một cuộc gọi .ajax thay vì một cuộc gọi .get

  3. Làm thủ công bằng cách thêm thông số mới có dấu thời gian vào cuộc gọi .get của bạn.

Tôi chỉ nghĩ rằng khả năng này nên được tích hợp vào cuộc gọi .get.

+1

Hiện đầy đủ 'get()' ví dụ? – Jivings

+0

Tôi muốn chuyển ngày/giờ của một tệp với trang (giả sử tôi đang sử dụng ngôn ngữ kịch bản phía máy chủ), và sau đó chuyển nó với yêu cầu cho trang dưới dạng tham số chuỗi truy vấn. Lý do tôi làm điều này là bởi vì nó cho phép bộ nhớ đệm, trừ khi trang đã thực sự thay đổi. – Archer

+1

Sử dụng bộ nhớ cache: false gắn thêm dấu thời gian vào yêu cầu ajax/json, ví dụ: {"get": "modified"} & _ = 1394836303603 đã phá vỡ yêu cầu API của tôi. Phải mất quá nhiều giờ để tìm ra những gì đã thêm dấu thời gian, vì nó được chôn cất trong tài liệu jQuery. Thay vì sử dụng bộ nhớ cache: sai, chỉ cần thêm dấu thời gian của riêng bạn, giả sử API của bạn sẽ không quan tâm nếu bạn thêm thông số không xác định. Như thế này: {"get": "modified", "timestamp": "1394836303603"} Điều này cũng cho phép bạn kiểm soát tốt hơn đối với những mục được lưu trong bộ nhớ cache và không. –

Trả lời

34

Với tôi, cách thực hiện chính xác sẽ là những cách được liệt kê. Hoặc là ajax hoặc ajaxSetup. Nếu bạn thực sự muốn sử dụng get và không sử dụng ajaxSetup thì bạn có thể tạo thông số của riêng mình và cung cấp cho nó giá trị của ngày/giờ hiện tại.

Tuy nhiên, tôi sẽ đặt câu hỏi về động cơ của bạn khi không sử dụng một trong các phương pháp khác.

+1

Đáng chú ý rằng trong ứng dụng cụ thể của tôi, tôi sử dụng bộ nhớ cache: false trong ajaxSetup (phần lớn các cuộc gọi của tôi là để json endpoints cho payloads) và sau đó tôi sử dụng $ .ajax (..., cache: true) cho bất kỳ mẫu cụ thể hoặc những thứ mà tôi sẽ muốn lưu vào bộ nhớ cache. Dù sao tôi vẫn thích điều này, vì nó làm cho mọi thứ khá rõ ràng, và tôi gọi nhiều hơn các cuộc gọi tải trọng hơn dữ liệu tĩnh. – David

80

Tự thêm thông số.

$.get(url,{ "_": $.now() }, function(rdata){ 
    console.log(rdata); 
}); 

Tính đến jQuery 3.0, bây giờ bạn có thể làm điều này:

$.get({ 
    url: url, 
    cache: false 
}).then(function(rdata){ 
    console.log(rdata); 
}); 
+5

cảm ơn $ .now() là viết tắt của Date(). GetTime() mới. http://api.jquery.com/jQuery.now/ – Barka

+0

Đẹp, nó hoạt động! :) – wooncherk

+0

Bây giờ bạn có thể thực hiện 'Date.now()'. – Jivings

62

Tôi nghĩ rằng bạn phải sử dụng phương thức AJAX thay vì cho phép bạn chuyển bộ nhớ đệm off:

$.ajax({ 
    url: "test.html", 
    data: 'foo', 
    success: function(){ 
    alert('bar'); 
    }, 
    cache: false 
}); 
+2

Lưu trữ IE9 và dường như thực sự không thích .get – Ross

+4

@Ross Không nên thực hiện nếu bạn đặt 'bộ nhớ cache' thành' false' theo câu trả lời của tôi. – Jivings

+2

3 năm sau và tôi chỉ mất nửa ngày để cùng một vấn đề chính xác – Joel

7

Theo tài liệu JQuery, .get() chỉ mất url, data (nội dung), dataTypesuccess gọi lại làm thông số của nó. Những gì bạn đang thực sự muốn làm ở đây là sửa đổi đối tượng jqXHR trước khi nó được gửi đi. Với .ajax(), việc này được thực hiện bằng phương pháp beforeSend(). Nhưng kể từ khi .get() là một phím tắt, nó không cho phép nó.

Cần tương đối dễ dàng để chuyển đổi các cuộc gọi .ajax() của bạn thành .get() cuộc gọi. Rốt cuộc, .get() chỉ là một tập con của .ajax(), vì vậy bạn có thể sử dụng tất cả các giá trị mặc định cho .ajax() (ngoại trừ, tất nhiên, đối với beforeSend()).

Edit:

:: Trông tại Jivings' câu trả lời ::

Oh yeah, quên về tham số cache! Mặc dù beforeSend() hữu ích khi thêm các tiêu đề khác, thông số được xây dựng trong cache đơn giản hơn nhiều ở đây.

+0

Tuyệt vời cho công sức và tìm kiếm một cách khác! :) – Jivings

1

Tôi rất muộn trong trò chơi, nhưng điều này có thể giúp người khác. Tôi đã gặp vấn đề tương tự với $ .get và tôi không muốn tắt bộ nhớ đệm một cách mù quáng và tôi không thích bản vá dấu thời gian. Vì vậy, sau một ít nghiên cứu tôi thấy rằng bạn có thể chỉ cần sử dụng $ .post thay vì $ .get mà KHÔNG sử dụng bộ nhớ đệm. Đơn giản như thế. :)

+0

Tôi trễ quá :) cảm ơn sự đóng góp của bạn, nó hoạt động tốt –

+0

Đây là một lời khuyên xấu như GET và POST là động từ khác nhau và nên được sử dụng cho những thứ khác nhau. Url máy chủ tương tự có thể được lọc theo động từ, ví dụ như một POST sẽ không hoạt động nếu máy chủ chỉ mong đợi một GET. Hoặc thậm chí tệ hơn, máy chủ có thể có các hành vi khác nhau cho GET và POST (thực sự rất phổ biến). – Andrew

2

Set cache: false trong jQuery.get gọi điện bằng Dưới Phương pháp

sử dụng mới Date().getTime(), đó sẽ tránh được va chạm, trừ khi bạn có nhiều yêu cầu xảy ra trong một phần nghìn giây cùng.

Hoặc

Sau đây sẽ ngăn chặn tất cả các yêu cầu AJAX tương lai khỏi bị lưu trữ, bất kể là phương pháp jQuery bạn sử dụng ($ .get, $ .ajax vv)

$.ajaxSetup({ cache: false }); 
1

Note rằng cú pháp gọi lại là deprecated:

Deprecation Thông báo

Các phương thức jqXHR.success(), jqXHR.error() và jqXHR.complete() gọi lại các phương thức được giới thiệu trong jQuery 1.5 không được chấp nhận như của jQuery 1.8. Để chuẩn bị mã của bạn để xóa lần cuối, hãy sử dụng jqXHR.done(), jqXHR.fail() và jqXHR.always() để thay thế.

Dưới đây là một giải pháp hiện đại hóa bằng cách sử dụng giao diện promise

$.ajax({url: "...", cache: false}).done(function(data) { 
    // data contains result 
}).fail(function(err){ 
    // error 
}); 
Các vấn đề liên quan