有没有推荐的通用模式来记忆ajax调用?



我正在处理通过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);
};

最新更新