如何模拟同步ajax调用? (基于异步的同步)

时间:2012-08-31 11:59:23

标签: javascript ajax

由于“原生”同步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?

3 个答案:

答案 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>