如何在Javascript中缓存XMLHttpRequest响应?

时间:2017-01-08 19:13:57

标签: 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);
        });
    }

如何通过浏览器扩展此功能以缓存响应?

1 个答案:

答案 0 :(得分:2)

假设缓存的意思是不重复在该页面加载的生命周期中发出相同的请求,您可以将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];
    }

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