Javascript AJAX—执行顺序有保证吗?

Javascript AJAX—执行顺序有保证吗?,javascript,ajax,Javascript,Ajax,在下面的代码中,doThisFirst()是否保证在doThisFirst()之前执行 如果没有,我如何保证这个执行顺序(除了在doThisFirst()的末尾设置一个标志,然后在执行doThisFirst()之前轮询while(!flag);)这一天真的解决方案之外)?。我正在寻找一个纯Javascript解决方案(没有jquery) 重要提示:我不希望同步执行AJAX请求,它将在doThisFirst()之前执行doThisFirst()doThisFirst()将在xmlhttp.send

在下面的代码中,
doThisFirst()
是否保证在
doThisFirst()
之前执行

如果没有,我如何保证这个执行顺序(除了在
doThisFirst()
的末尾设置一个标志,然后在执行
doThisFirst()
之前轮询
while(!flag);
)这一天真的解决方案之外)?。我正在寻找一个纯Javascript解决方案(没有jquery)

重要提示:我不希望同步执行AJAX请求,它将在
doThisFirst()
之前执行
doThisFirst()
doThisFirst()
将在
xmlhttp.send
之后同步执行,在将控制流释放回数据库之前,无法执行和
xmlhttp.onreadystatechange


有一个陷阱。可能*回调是作为
.send()
的一部分执行的,在这种情况下,
会先执行第二个
,因为代码不需要释放到事件循环。如果需要强制执行异步行为,只需将
dothissond
包装为
setTimeout(function(){dothissond(xmlhttp.response.Text)},1)
将强制在将流控件释放到事件循环之前不能调用该函数

在您的示例中,它不应该有什么区别,因为我非常确定
onreadystatechange
总是在发布到事件循环之后调用(尽管有同步XHR)


*无论是通过设置以同步阻塞方式执行AJAX调用,还是由于缓存,我真的不太了解跨浏览器的XHR细微差别

谢谢您的回答。发送到事件循环的消息数量是否取决于函数调用或语句的数量?例如,如果我将10条语句放在
doThisFirst()
之后,它们是否都会在
xmlhttp.onreadystatechange
?@1''之前执行,则事件循环中的消息由消息的类型而不是数量决定。使用
setTimeout
的事件侦听器和回调是在事件循环中将更多调用排队的最常见方法。在本例中,
onreadystatechange
是一个事件监听器。这也是我的直觉,但我试图找到支持这一点的文档。我一直想知道缓存内容时会发生什么。我想,
send()
可能会触发
onreadystatechange
事件。您知道哪些文档要求浏览器尊重
send()
的异步特性吗?还是您依赖浏览器的现有实现?@BrianGenisio,我不知道是否强制这些事件回调的异步性质。更重要的是,我对现有实现了解不够,无法在可能出现跨浏览器不一致的情况下发出警告。这就是为什么我添加了关于使用
setTimeout
强制回调代码进入事件循环的第二点。@zzzzBov我看到了您的更新。我想这能澄清你的回答。OP询问是否有保证。我找不到任何定义行为的规范,所以我认为答案是“不保证,但实用”。我喜欢你强制执行行为的想法,尽管仍然可能存在细微的差异(我不能随便想出任何答案)。
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : 
    new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        doThisSecond(xmlhttp.responseText);
    }
};
xmlhttp.open("GET", "/myscript.php?", true);
xmlhttp.send();
doThisFirst();