2011-10-17 25 views
6

Tôi đang làm việc với một số dữ liệu của chính phủ được xuất bản qua Socrata'sSODA api.Có một mẫu chung được khuyến cáo để ghi nhớ các cuộc gọi ajax không?

API này cung cấp cách truy xuất các hàng thông qua cuộc gọi REST. API cho phép tham số hóa giới hạn truy vấn - về cơ bản bạn có thể thực hiện tìm kiếm văn bản đầy đủ và không có gì khác. Tôi không thể tìm thấy cách để định hình dữ liệu được trả lại - ví dụ: chỉ trả về các cột nhất định của dữ liệu.

Kết quả là, về cơ bản tôi chỉ có thể nhận tất cả các hàng và tất cả các cột của mỗi chế độ xem dữ liệu. Điều này là ok, tôi đoán, nhưng tôi muốn cache nó - ghi nhớ nó để sử dụng thuật ngữ gạch dưới.

Có mẫu để ghi nhớ cuộc gọi ajax với jQuery không?


EDIT: Để cung cấp cho bạn một ý tưởng về những gì tôi đang nói đến, đây là những gì tôi đang làm hiện nay.

function onclick(event) { 
    var $t = $(event.currentTarget); 
    var itemId = $t.attr('data-itemid'); 
    var url = getRestUrl(itemId); 
    if (typeof datacache[itemId] === "undefined") { 
     $.ajax({ 
      url  : url, 
      cache  : true, 
      type  : "GET", 
      dataType : "json", 
      error  : function(xhr,status,error) { 
       raiseError(error); 
      }, 
      success : function(response, arg2, xhr) { 
       datacache[itemId] = response; 
       doSomethingWithTheData(url, itemId); 
      }}); 
    } 
    else { 
     doSomethingWithTheData(url, itemId); 
    } 
} 

// then, doSomethingWithTheData() simply references datacache[itemId] 

dường như như nó nhanh hơn mặc dù tôi chưa đo. Những gì tôi thực sự muốn biết là, là có một mô hình phổ biến mà làm một cái gì đó như thế này, mà tôi có thể sử dụng, để tất cả những người đọc mã sẽ ngay lập tức nhìn thấy những gì tôi đang làm ??

+1

Dường như nó phụ thuộc nhiều ** vào bản chất của nguồn dữ liệu. – Pointy

+0

Tại sao vậy? Giả sử dữ liệu quay lại là json. Tôi muốn giảm thiểu việc sử dụng XHR và thậm chí muốn giảm thiểu các kết quả XHR-với-được lưu trữ. Các mô hình nên được khá đơn giản, và chung chung. – Cheeso

+0

Điều tôi ngụ ý là nó phụ thuộc vào "tính tương thích" của dữ liệu. – Pointy

Trả lời

3

Bạn có thể có thể làm điều gì đó giống như được thực hiện với tra cứu autocomplete (điều này là rất nhiều từ bộ nhớ, nhưng bạn sẽ nhận được các ý tưởng):

var searchCache = {}, searchXhr = null; 

function Search(term) { 

    if (term in searchCache) { 
     return doSomethingWithTheData(searchCache[term]); 
    } 

    if (searchXhr != null) { 
     searchXhr.abort(); 
    } 

    searchXhr = $.ajax({ 
     url  : url, 
     cache  : true, 
     type  : "GET", 
     dataType : "json", 
     error  : function(xhr, status, error) { 
      raiseError(error); 
     }, 
     success : function(response, arg2, xhr) { 
      searchCache[term] = response; 
      if (xhr == searchXhr) { 
       doSomethingWithTheData(response); 
       searchXhr = null; 
      } 
     } 
    }); 

} 
0

Tôi không nhất thiết phải là chuyên gia tốt nhất cho câu hỏi Javascript, nhưng tôi có thể giúp bạn sử dụng SODA.

Nếu bạn đang tìm kiếm sự linh hoạt hơn trong truy vấn và bạn có thể thực hiện HTTP POST, bạn có thể xem cú pháp truy vấn của chúng tôi để thực hiện truy vấn được nhắm mục tiêu nhiều hơn: http://dev.socrata.com/querying-datasets. Cú pháp truy vấn của chúng ta khá phức tạp, nhưng tôi có thể giúp bạn tìm ra cách cấu trúc truy vấn của bạn nếu bạn nhấn bất kỳ snags nào.

Thật không may, vì yêu cầu POST, bạn cần thoát khỏi hộp khóa tên miền chéo XHR bằng cách thực hiện proxy hoặc tương tự.

Ngoài ra, FYI, chúng tôi đang làm việc trên một cú pháp hoàn toàn mới cho phép bạn chỉ định truy vấn dưới dạng tham số URL, vì vậy bạn sẽ có thể thực hiện các yêu cầu đơn giản như /resources/agencies?acronym=CIA hoặc /resources/agencies?$where='budget > 10000000'. Nó sẽ khá tuyệt vời.

+0

Cảm ơn, Chris. Tôi sẽ cố gắng làm điều đó. Tôi đang tìm kiếm tài liệu đó, nhưng không tìm thấy nó. Không chắc chắn lý do tại sao. Sẽ không có vấn đề gì khi sử dụng POST.Tôi đang sử dụng IIRF và ProxyPass để kết nối với nguồn dữ liệu. – Cheeso

+0

ok, tôi đã thử điều đó; nó không hoạt động theo cách tôi mong đợi. Tôi không thực sự kết nối với opendata.socrata.com. Tôi đang kết nối với một cơ quan govt. Tính năng truy vấn có được hỗ trợ trên tất cả các điểm cuối mạng xã hội có thể truy cập công khai không? Tôi có một số câu hỏi khác. và bình luận, nếu bạn quan tâm. có thể ngoại tuyến tốt hơn. – Cheeso

0

Bạn chỉ nhớ các yêu cầu ajax mà bạn biết sẽ không thay đổi, chẳng hạn như Facebook SDF chẳng hạn. Có vẻ như trong ví dụ của bạn, bạn đang yêu cầu một số giao diện người dùng có liên quan có thể không phù hợp với bộ nhớ cache? Nếu không, bạn có thể thử một cái gì đó như thế này:

var store = {};

/** 
* Memoized $.getScript 
* 
* Cache one script response per url 
* Reference, see http://msdn.microsoft.com/en-us/magazine/gg723713.aspx 
* 
* @example $.memoizedGetScript(url).then(successCallback, errorCallback); 
* @param {String} url 
* @param {Function} callback (optional) 
* @returns {*} 
*/ 
$.memoizedGetScript = function(url, callback) { 
    var callback = callback || {}; 

    store.cachedScripts = {}; 

    if (!store.cachedScripts[url]) { 
     store.cachedScripts[url] = $.Deferred(function(d) { 
      $.getScript(url).then(
       d.resolve(), 
       d.reject() 
      ); 
     }).promise(); 
    } 

    return store.cachedScripts[url].done(callback); 
}; 
Các vấn đề liên quan