我正在处理通过Socrata's SODA api发布的一些政府数据。
此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]
这个似乎就像它没有测量它更快。我真正想知道的是,是否有一个共同模式可以做到这样,我可以使用,这样每个阅读代码的人都会立即看到我在做什么?
答案 0 :(得分: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;
}
}
});
}
答案 1 :(得分:0)
我不一定是Javascript问题的最佳专家,但我可以帮助您使用SODA。
如果您在查询中寻求更大的灵活性,并且可以执行HTTP POST,则可以使用我们的查询语法来执行更有针对性的查询:http://dev.socrata.com/querying-datasets。我们的查询语法相当复杂,但如果您遇到任何障碍,我可以帮助您弄清楚如何构建查询。
不幸的是,由于需要POST,因此您需要通过代理或类似的东西来突破XHR跨域密码箱。
另外,仅供参考,我们正在开发一种全新的语法,允许您将查询指定为URL参数,这样您就可以执行简单的请求,例如/resources/agencies?acronym=CIA
或{{1} }。它应该非常棒。
答案 2 :(得分: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);
};