2011-10-17 64 views
6

我正在通過Socrata'sSODA api發佈一些政府數據。是否有推薦的常用模式來記憶ajax調用?

此API提供了一種通過REST調用檢索行的方法。該API允許查詢的有限參數化 - 基本上,您可以執行全文搜索,而不需要其他任何操作。我找不到一種方法來形成返回的數據 - 例如,只返回某些數據列。

因此,基本上我只能得到每個數據視圖的所有行和所有列。這是好的,我想,但我想緩存它 - 記憶它使用下劃線術語。

是否有一種模式用jQuery記憶ajax調用?


編輯:給你什麼,我談論的想法,這裏是我在做什麼目前。

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] 

似乎喜歡它的,雖然我還沒有測量速度更快。我真正想知道的是,是否有一種常見模式可以做到這一點,我可以使用,以便讀取代碼的每個人都能立即看到我在做什麼?

+1

似乎它將取決於數據源性質的** lot **。 – Pointy

+0

這是爲什麼?假設返回的數據是json。我想盡量減少XHR的使用,甚至希望最大限度地減少XHR與緩存結果。該模式應該非常簡單,並且是通用的。 – Cheeso

+0

我的意思是它取決於數據的「可變性」。 – Pointy

回答

3

等與自動完成查找做你也許能夠做一些事情(這是很多從內存,但你的想法):

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

我不一定是最好的專家對於Javascript問題,但我可能能夠幫助您使用SODA。

如果您在查詢中尋找更多靈活性,並且可以執行HTTP POST,則可以使用我們的查詢語法來執行更具針對性的查詢:http://dev.socrata.com/querying-datasets。我們的查詢語法相當複雜,但如果遇到任何障礙,我可以幫助您弄清楚如何構建查詢。

不幸的是,由於需要POST,所以您需要通過代理或類似的方式突破XHR跨域密碼箱。此外,僅供參考,我們正在研究一種全新的語法,可讓您將查詢指定爲URL參數,因此您可以執行簡單請求,如/resources/agencies?acronym=CIA/resources/agencies?$where='budget > 10000000'。它應該是非常棒的。

+0

謝謝,克里斯。我會嘗試。我正在尋找那個文檔,但沒有找到它。不知道爲什麼。使用POST不會有問題。我正在使用IIRF和ProxyPass連接到數據源。 – Cheeso

+0

好吧,我試過了;它沒有按照我的預期工作。我實際上並沒有連接到opendata.socrata.com。我連接到一個政府機構。查詢功能是否支持所有可公開訪問的socrata端點?我還有其他一些問題。如果你有興趣,也可以發表評論。也許更好的離線。 – Cheeso

0

你只會緩存你知道不會改變的ajax請求,例如Facebook的SDF。看起來在你的例子中,你正在請求一些可能不適合緩存的UI相關的東西。否則,您可能會嘗試如下所示:

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); 
}; 
相關問題