让jquery jqxhr就像已经发送请求一样

我有SendRequest对象,该类有一个像

request: function(args) { return $.ajax.apply(null, args); }; 

然后很多类使用SendRequest对象来获取服务器响应

  var prom = SendRequest.request( { type: 'GET', url: _this.uri }); return $.when(prom).done(function(response) { .... do something }); 

我的目标是在SendRequest.request中首先需要检查window.localStorage。 是否已经有值,如果之前没有任何值则发送请求。 否则,如果已经在localStorage上已经值,则返回之前带有该保存值的$ .ajax()对象。

  request: function(args) { var ls = window.localStorage; var savedResponse = ls.getItem(args.url); if (savedResponse !=== null) { var result = $.ajax(); result.responseText = savedResponse; result.readyState = 4; result.status = 'OK'; return result; } else { return $.ajax.apply(null, args); } }; 

但不幸的是它不起作用:(我一直在寻找,但找不到像我这样的案例

我已经尝试过如何欺骗jqXHR一直成功,但它没有多大帮助

这不起作用的原因是虽然你创建了一个假的jqXHR对象,它是来自$.ajax的响应,但该对象实际上并不是提供给.done回调的参数 – 它实际上是第三个参数。

此外,恕我直言,你不应该真正使用$.when .when来“宣传”一个非承诺对象。 它旨在处理多个承诺之间的同步,以及它将每个非承诺包装成新承诺的事实只是一个副作用。

相反,您应该使用适当的数据创建一个已经“解决”的新承诺:

 if (savedResponse != null) { return $.Deferred(function() { // retrieve relevant fields from localStorage ... this.resolve([data, textStatus, jqXHR]); }).promise(); } else { // perform real AJAX request return $.ajax.apply($, args); } 

或者,考虑只记忆返回数据本身(成功调用),而不是整个响应三元组。

你也可以找到我在jQuery UK 2013上使用的这个演示文稿 – http://www.slideshare.net/RayBellis/memoizing-withindexeddb