1

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

4

1 回答 1

3

doThisFirst()xmlhttp.send之后会同步xmlhttp.onreadystatechange执行,直到控制流释放回“事件循环”才能执行。


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

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

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

于 2013-09-04T00:18:29.003 回答