0

由于“本机”同步 ajax 调用会阻塞浏览器用户界面,因此它不适合大多数实际情况(至少我的情况)。

我想知道是否有任何方法可以使用异步(非阻塞)ajax 调用来模拟同步(阻塞)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 调用,它不会阻塞 UI

Javascript 不支持多线程,所以这可能是不可能的,但值得一问。

这是本题的第三个问题。
这些问题跟着我到了当前的问题:
如何阻止 ajax 调用(我希望它阻止)
同步(阻塞)ajax 调用能否阻止浏览器的 UI?

4

3 回答 3

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”在内的大量框架事件和方法,这将允许您在“done”事件中应用类似的锁定机制。

于 2012-08-31T12:10:17.563 回答
0

要更新 UI,需要将执行返回给浏览器,唯一的方法是通过异步代码(或其他立即返回的代码)

于 2012-08-31T12:02:27.653 回答
0

如果您什么都不做,为什么要“阻止”某些事情呢?看来您实际上并不了解异步流程。您无需“等待”——而是在数据可用时声明要做什么。使用包含其余代码的回调设置您的请求,调度请求并从 Javascript 返回,让浏览器完成自己的任务,直到您的代码再次工作。

于 2012-08-31T12:04:21.297 回答