在Is JavaScript guaranteed to be single-threaded? 很明显,无论javascript是单线程,还是有一些警告。
我想知道以下伪代码是否总是可预测的(我'使用'jQuery)
var lastReq;
$('#button').click(function()
{
if (lastReq) lastReq.abort();
lastReq = $.ajax(...);
});
案例可能是在click事件和中止之间,来自服务器的数据通过并在de eventqueue上放置一个事件。如果在中止之前发生这种情况,则会触发ajax帖子的成功事件。 我不知道如何真正测试这种可能的竞争条件。
有谁知道这是如何工作的?或者如何使用准备好的示例进行测试?
答案 0 :(得分:1)
编辑: 一旦中止请求,浏览器就不应该再听它了。所以当它到达事件队列中的响应时,我的猜测是它应该把它扔掉。
但是,如果您遇到问题,可以尝试以下方法:
如果检测到不再需要运行,你可以检查你的成功函数+ url取消它自己吗?
例如(我不是说你应该这样做,我没有尝试将任何内容附加到jqXHR请求):
var numReq = 0, lastReq;
$('#button').on('click', function(e) {
if (lastReq) { lastReq.abort(); }
numReq ++;
lastReq = $.ajax({
success : function(d, s, x) {
if (x.reqNum < numReq) { return; }
}
});
lastReq.reqNum = numReq;
});
我的理解是ajax事件在按钮点击完成之前不会被添加到事件队列中,所以你不应该(理论上)担心在ajax之后设置reqNum ......
我也尝试过以下代码:
var numReq = 0, lastReq, timer = 100,
c = setInterval(function() {
if (lastReq) { lastReq.abort(); }
numReq ++;
lastReq = $.ajax({
url : 'index.html',
cache : false,
success : function(d, s, x) {
if (x.reqNum < numReq) { console.log('it happens'); }
}
});
lastReq.reqNum = numReq;
}, timer);
改变计时器以尝试匹配(尽可能接近)页面的加载时间。我没有“它发生”出现。
答案 1 :(得分:1)
我不知道这种解决方法是否真的有用并且是防弹的(我正在尝试创造性)但是,因为jQuery 1.5 ajax方法返回一个延迟对象lastReq
有{{1} }方法可用
来自http://api.jquery.com/deferred.state/
deferred.state()方法返回表示Deferred对象当前状态的字符串。 Deferred对象可以处于以下三种状态之一:
...
“已解决”:Deferred对象处于已解析状态,这意味着已为对象调用deferred.resolve()或deferred.resolveWith(),并且已调用doneCallbacks < strong>(或正在被召唤)。
所以你可以像这样重构你的代码
state()
希望这可以帮助您提供一个工作的想法,但我怀疑没有真正需要这种解决方法