在JavaScript/浏览器中缓存一个jQuery AJAX的响应

7 浏览
0 Comments

在JavaScript/浏览器中缓存一个jQuery AJAX的响应

我想在javascript/浏览器中启用ajax响应的缓存。

根据jquery.ajax文档

默认情况下,请求总是发出的,但浏览器可能从缓存中提供结果。要禁止使用缓存结果,请将cache设置为false。要使请求在自上次请求以来未修改资源时报告失败,请将ifModified设置为true。

然而,这两个选项都不能强制缓存。

动机:

我想将$.ajax({...})调用放在我的初始化函数中,其中一些函数请求相同的url。有时我需要调用其中一个初始化函数,有时我需要调用多个。

因此,如果已经加载了特定的url,我希望尽量减少向服务器发送的请求。

我可以自己制定解决方案(可能有些困难!),但我想知道是否有一种标准的方法来实现这一点。

0
0 Comments

在使用phonegap应用程序存储时,我正在寻找缓存的方法,我找到了使用localCache的答案,这很好,但是我想使用localStorage作为缓存数据的替代方法。因此,我创建了一个使用localStorage的示例,以帮助其他可能希望使用localStorage而不是localCache进行缓存的人。

Ajax调用:

$.ajax({
    type: "POST",
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    url: url,
    data: '{"Id":"' + Id + '"}',
    cache: true, //If you want to cache, set it to "true"; otherwise, set it to "false"
    //async: false,
    success: function (data) {
        var resData = JSON.parse(data);
        var Info = resData.Info;
        if (Info) {
            customerName = Info.FirstName;
        }
    },
    error: function (xhr, textStatus, error) {
        alert("Error Happened!");
    }
});

存储数据到localStorage:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
if (options.cache) {
    var success = originalOptions.success || $.noop,
        url = originalOptions.url;
    options.cache = false; //remove jQuery cache as we have our own localStorage
    options.beforeSend = function () {
        if (localStorage.getItem(url)) {
            success(localStorage.getItem(url));
            return false;
        }
        return true;
    };
    options.success = function (data, textStatus) {
        var responseData = JSON.stringify(data.responseJSON);
        localStorage.setItem(url, responseData);
        if ($.isFunction(success)) success(responseJSON); //call back to original ajax call
    };
}
});

如果要删除localStorage,请在需要的地方使用以下语句:

localStorage.removeItem("Info");

希望对其他人有所帮助!

localStorage.removeItem("Info");中,关于"info",它是指url吗?

info是用于将数据存储在localStorage中的对象的名称。

一直收到responseJSON is not defined的错误。有什么方法可以解决这个问题吗?(我的数据类型是html)

responseJSON更改为data,并使用var responseData = JSON.stringify(data);替代,对于success函数也做同样的更改。

我更喜欢localStorage,因为我需要在多个请求之间进行缓存。

0
0 Comments

现代浏览器都提供了存储API,可以使用它们(localStorage或sessionStorage)来保存数据。只需在接收到响应后将其存储到浏览器存储中。然后在下次发起相同的调用时,搜索是否已经保存了响应。如果是,就从存储中返回响应;如果没有,则进行新的调用。

Smartjax插件也可以实现类似的功能;但是由于你只需要保存调用的响应,可以在jQuery的ajax成功函数中编写代码来保存响应。在发起调用之前,只需检查是否已经保存了响应。

如果我将响应保存在IndexedDB中,有没有办法检查IndexedDB?另外,如果我使用Session Storage,有没有办法使用jQuery来检查响应是否存在。我不能包含除了jQuery之外的任何库。谢谢。

0
0 Comments

这个问题的出现是因为在使用jQuery的ajax方法时,设置cache为true只对GET和HEAD请求有效。解决方法是自己实现一个缓存的解决方案,可以使用一个本地缓存对象来存储数据,然后在发送请求之前检查本地缓存中是否存在相应的数据,如果存在则直接返回缓存数据,否则发送请求并将返回的数据存储到本地缓存中。

以下是一个实现缓存的示例代码:

var localCache = {
    data: {},
    remove: function (url) {
        delete localCache.data[url];
    },
    exist: function (url) {
        return localCache.data.hasOwnProperty(url) && localCache.data[url] !== null;
    },
    get: function (url) {
        console.log('Getting in cache for url' + url);
        return localCache.data[url];
    },
    set: function (url, cachedData, callback) {
        localCache.remove(url);
        localCache.data[url] = cachedData;
        if ($.isFunction(callback)) callback(cachedData);
    }
};
$(function () {
    var url = '/echo/jsonp/';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
            cache: true,
            beforeSend: function () {
                if (localCache.exist(url)) {
                    doSomething(localCache.get(url));
                    return false;
                }
                return true;
            },
            complete: function (jqXHR, textStatus) {
                localCache.set(url, jqXHR, doSomething);
            }
        });
    });
});
function doSomething(data) {
    console.log(data);
}

上面的代码使用一个名为`localCache`的对象来实现缓存功能。在发送ajax请求之前,会先检查本地缓存中是否存在相应的数据,如果存在则直接调用`doSomething`函数处理缓存数据,否则发送请求并在请求完成时将返回的数据存储到本地缓存中。

通过这种方式,可以实现对ajax请求的响应进行缓存,提高页面加载速度和减轻服务器压力。

更多关于该的问题和其他解决方案可以参考原文链接:Working fiddle here

0