我正在处理通过socrates的SODA api发布的一些政府数据。
这个API提供了一种通过REST调用检索行的方法。API允许对查询进行有限的参数化——基本上,您只能进行全文搜索,而不能进行其他操作。我找不到一种方法来塑造返回的数据—例如,只返回数据的某些列。
因此,基本上我只能获得每个数据视图的所有行和所有列。这是好的,我想,但我想缓存它- 记忆它使用下划线项。是否有一个模式的ajax调用记忆与jQuery?
EDIT:为了让你了解我在说什么,下面是我目前正在做的。
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]
这个似乎更快,虽然我还没有测量过。我真正想知道的是,是否有一个通用的模式,我可以采用这样的模式,以便每个阅读代码的人都能立即看到我在做什么??
你可能会做一些像自动完成查找(这是非常内存,但你会得到的想法):
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;
}
}
});
}
我不一定是Javascript问题的最佳专家,但我可能能够帮助您使用SODA。
如果你正在寻找更灵活的查询,你可以做一个HTTP POST,你可以看看使用我们的查询语法做一个更有针对性的查询:http://dev.socrata.com/querying-datasets。我们的查询语法相当复杂,但如果遇到任何问题,我可以帮助您弄清楚如何构建查询。
不幸的是,由于这需要POST,因此您需要通过代理或类似的方法来打破XHR跨域锁盒。
另外,供参考,我们正在研究一个全新的语法,它将允许你指定查询作为URL参数,所以你将能够执行简单的请求,如/resources/agencies?acronym=CIA
或/resources/agencies?$where='budget > 10000000'
。
您只会缓存您知道不会更改的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);
};