由于“原生”同步ajax调用会阻止浏览器用户界面,因此它不适合大多数现实案例(至少我的)。
我想知道有没有办法模拟同步(阻塞)ajax调用,使用异步(NON-blocking)ajax调用,这样结果就是同步调用但没有阻止UI。
以下代码更好地解释了它:
function do_synchronous_ajax_call(url){
// Performs an asynchronous ajax call, which doesn't block the UI, BUT, blocks this current script execution
}
var xyz = do_synchronous_ajax_call("http://...."); // Call is blocking until the inner ajax call returns
// Process `xyz` from here
如您所见,上述内容希望有某种“合成”同步ajax调用,不会阻止用户界面。
Javascript不支持多线程,因此可能不可能,但值得一提。
这是该主题的第三个问题
这些问题跟我谈到了当前的问题:
how to block on ajax call (I want it to block)
can a synchronous (blocking) ajax call block the browser's UI?
答案 0 :(得分:0)
要使UI更新,执行需要返回给浏览器,唯一的方法是通过异步代码(或其他立即返回的代码)
答案 1 :(得分:0)
为什么“阻止”某些东西,如果你可以简单地做什么呢?看起来你实际上并不了解异步流程。你没有“等待” - 而是在数据可用时声明要做什么。使用回调设置您的请求,该回调将包含其余代码,调度请求和从Javascript返回,让浏览器执行自己的任务,直到您的代码再次运行为止。
答案 2 :(得分:0)
您可以设置全局可用的锁定。无论您是使用全局变量,还是拥有一个在全局级别保存任何选项或对象的对象集,您都可以使用布尔锁。
function do_ajax_call(url)
{
if (!locked)
{
// yadda yadda yadda
locked = true;
myxmlhttpobj.onreadystatechange = HandleCallback;
}
}
function HandleCallback() {
if (myxmlhttpobj.readyState==4 && myxmlhttpobj.status==200)
{
// more yadda yadda
}
locked = false;
}
如果切换到jQuery AJAX,您将获得一系列框架事件和方法的好处,包括“beforeSend”,这将允许您将“完成”事件与类似的锁定机制结合使用。 / p>