【发布时间】:2015-09-18 03:41:27
【问题描述】:
我正在使用 jQuery (v.3.0.0),我需要 ajaxSend() 来检查 localStorage 中是否存在值,并将其添加到传出请求标头中。
如果localStorage 中不存在该值,ajaxSend() 应通过另一个 Ajax 请求获取该值,然后在标头中发送具有正确值的原始请求。
这必须是一个全局处理程序,适用于所有发出的 jQuery Ajax 请求。
让我们做一个代码示例。
$(document).ajaxSend(function (ev, req, opts) {
// Before sending any jQuery Ajax request
var original = req;
if (localStorage.foo) {
// If value "foo" is available, add it to the headers
req.setRequestHeader('foo', localStorage.foo);
} else {
// Otherwise get it first, and add it to the headers
$.get({url: '/foo', global: false})
.done(function (data, textStatus, req) {
// "foo" is received and added to the original request headers
localStorage.foo = data;
original.setRequestHeader('foo', data);
// Now the original request is ready to be sent
});
}
});
当foo不可用时,上面代码的问题是,很明显原始请求是在foo的值被检索之前发出的。
有没有办法解决这个问题并让它正常工作?
谢谢!!
【问题讨论】:
-
你不能在第二个ajax调用中添加
async: false吗? -
不,这会同时阻止一切,绝对不是一个好的选择。顺便说一句,
jQuery.ajax()docs 中也提到了它,请查看:“强烈建议不要将此选项设置为 false(从而使调用不再异步),因为它可能导致浏览器无响应。” -
很抱歉,您试图将一个 ajax 调用包装在另一个 ajax 调用中,但这是行不通的
-
嗯,这正是我要解决的问题。如果找到一种方法来控制 Ajax 调用的排队,那么它就可以解决。
标签: javascript jquery ajax asynchronous