我有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);
}
};
但不幸的是它没有用:(
我一直在寻找但找不到像我这样的案例
我已经尝试过这种方式
how to fool jqXHR to succeed always
但它没有太大帮助
最佳答案
这行不通的原因是,尽管您创建了一个伪造的jqXHR
对象,它是来自$.ajax
的响应,但该对象实际上并不是提供给.done
回调的参数-实际上是第三个参数。
同样,恕我直言,您不应该真正使用$.when
“承诺”单个非承诺对象。它旨在处理多个Promise之间的同步,并且将每个非Promise封装为一个新Promise的事实只是副作用。
相反,您应该使用适当的数据创建一个已经“解决”的新承诺:
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
关于javascript - 使jquery jqxhr像已经发送请求一样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27620885/