AJAX - 保证执行顺序?

时间:2013-09-03 18:20:32

标签: javascript ajax

在以下代码中,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()

1 个答案:

答案 0 :(得分:3)

doThisFirst()将在xmlhttp.send之后同步执行,并且在控制流已释放回"Event Loop"之前无法执行xmlhttp.onreadystatechange


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

在你的例子中它不应该有所作为,因为我相当确定在发布到事件循环之后总是调用onreadystatechange(尽管有同步XHR)。

*是否设置为以同步阻塞方式执行AJAX调用,或者由于缓存,老实说我不知道​​跨浏览器的XHR细微差别