在以下代码中,doThisFirst()
保证在doThisSecond()
之前执行?
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();
如果没有,我如何保证这个执行顺序(除了在doThisFirst()
结束时设置标志然后在执行while(!flag);
之前轮询doThisSecond()
)的天真解决方案?我正在寻找一个纯Javascript解决方案(没有jquery)。
重要提示:我不想要同步执行AJAX请求,这将在doThisSecond()
之前执行doThisFirst()
。
答案 0 :(得分:3)
doThisFirst()
将在xmlhttp.send
之后同步执行,并且在控制流已释放回"Event Loop"之前无法执行xmlhttp.onreadystatechange
。
有一个问题。 可能可能*回调作为.send()
的一部分执行,在这种情况下doThisSecond
将首先执行,因为代码永远不需要释放到事件循环。如果需要强制执行异步行为,只需将doThisSecond
包装为setTimeout(function () { doThisSecond(xmlhttp.response.Text) }, 1)
将强制在流控制释放到事件循环之前无法调用该函数。
在你的例子中它不应该有所作为,因为我相当确定在发布到事件循环之后总是调用onreadystatechange
(尽管有同步XHR)。
*是否设置为以同步阻塞方式执行AJAX调用,或者由于缓存,老实说我不知道跨浏览器的XHR细微差别