gpt4 book ai didi

javascript - 是否可以在 Javascript 循环中更新浏览器窗口?

转载 作者:行者123 更新时间:2023-12-04 15:37:55 25 4
gpt4 key购买 nike

我有一个当前需要同步的 Ajax 调用。但是,在执行此 Ajax 调用时,浏览器界面会卡住,直到调用返回。在超时的情况下,这可能会卡住浏览器 significant period of time .

有没有办法让浏览器(任何浏览器)刷新用户界面,但不执行任何 Javascript?理想情况下,它会是一些命令,如 window.update() ,这将使用户界面线程刷新。

如果这是可能的,那么我可以用类似的东西替换同步 AJAX 调用:

obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume

无法使用的原因 setTimeout ,或者在回调中恢复一个函数,是执行流程不能被中断:(有太多的状态变量相互依赖,否则 long_function()流程必须以某种方式恢复):
function long_function() {
// lots of code, reads/writes variable 'a', 'b', ...
if (sync_call_is_true()) {
// lots of code, reads/writes variable 'a', 'b', ...
} else {
// lots of code, reads/writes variable 'a', 'b', ...
}
// lots of code, reads/writes variable 'a', 'b', ...
return calculated_value;
}

最佳答案

您需要将同步请求替换为异步请求并使用回调。一个过于简单的例子是:

obj = do_async_ajax_call(function (data, success)
{
if (success)
{
// continue...
}
});

function do_async_ajax_call(callback)
{
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://mysite.com", true);
xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 && xhr.status == 200)
callback(xhr.responseXML, true);
else if (xhr.readyState == 4)
callback(null, false);
}
xhr.send();
}

这样,您将匿名函数作为参数传递给 ajax 请求函数。 ajax 完成后,将调用传递的函数,并将 responseXML 传递给它。与此同时,在调用完成之前,浏览器一直可以自由地做它平常的事情。从这里开始,您的其余代码将继续。

关于javascript - 是否可以在 Javascript 循环中更新浏览器窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com