javascript - 如何在 Javascript 中缓存 XMLHttpRequest 响应?

标签 javascript ajax templates caching

我有一个异步加载我的 html 模板的函数:

loadTplAsync: function(path) {

        return Q.Promise(function(resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", path, true);
            xhr.onload = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(_.template(xhr.responseText));
                    } else {
                        reject(xhr.responseText);
                    }
                }
            };

            xhr.onerror = error => reject(error);
            xhr.send(null);
        });
    }

如何扩展这个功能来缓存浏览器的响应?

最佳答案

假设缓存的意思不是在该页面加载的生命周期内重复发出相同的请求,您可以将 promise 存储为变量并每次返回相同的 promise 。

第一次请求特定路径时会重新请求,以后只会返回存储的promise

var promises ={};
loadTplAsync: function(path) {
        // create new promise if it doesn't already exist for path instance
        if(!promises[path]){
          promises[path] = Q.Promise(function(resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", path, true);
            xhr.onload = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(_.template(xhr.responseText));
                    } else {
                        reject(xhr.responseText);
                    }
                }
            };

            xhr.onerror = error => reject(error);
            xhr.send(null);
        });
      }
      // return the stored promise
      return promises[path];
    }

请注意,这不是持久缓存,新请求将在后续页面加载时发出

关于javascript - 如何在 Javascript 中缓存 XMLHttpRequest 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536714/

相关文章:

javascript - 如何使用 AJAX 提交表单而无需离开页面 HTML Formsubmit

javascript - 表格中具有不同尺寸图像的所有单元格的尺寸是否相同?

javascript - 使用Jquery/Ajax在 View 中显示codeigniter函数的结果

javascript - 断言失败 : The value that #each loops over must be an Array. 你通过了 [object Object]

c++ - 将类查看到容器中

javascript - 这两个类定义有什么区别?

javascript - React - 全部展开/折叠

php - Ajax 关联数组

c++ - 可变参数模板中元函数的最大大小

java - 强制 Eclipse 自动导入具有多个选项的类