让 jquery jqxhr 像已经在发送请求一样
Make jquery jqxhr act like already sending request
>我有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
来"承诺"单个非承诺对象。 它旨在处理多个承诺之间的同步,它将每个非承诺包装成新承诺的事实只是一个副作用。
相反,您应该创建一个已经使用适当数据"解析"的新承诺:
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
相关文章:
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 在openshift node js应用程序中获取请求
- 反应路由器弄乱了请求网址
- 在我的情况下,如何进行http请求
- 使用密码对话框Javascript请求帮助
- servlet中的请求对象,而不是从jsp接收参数值
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- 如何使用动态请求参数实现像谷歌一样的自动完成
- Ajax是否像HTTP请求一样安全?
- 让 jquery jqxhr 像已经在发送请求一样
- 并行请求或像节点.js一样排队
- 如何让我的点击每次都得到一个新的Ajax请求,而不仅仅是像以前一样使用相同的Ajax请求