是否有推荐的常见模式来记忆ajax调用?

时间:2011-10-17 23:59:20

标签: javascript jquery memoization

我正在处理通过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]

这个似乎就像它没有测量它更快。我真正想知道的是,是否有一个共同模式可以做到这样,我可以使用,这样每个阅读代码的人都会立即看到我在做什么?

3 个答案:

答案 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);
};