jev*_*von 6 javascript ajax firefox user-interface javascript-events
我有一个Ajax调用,目前需要同步.但是,在执行此Ajax调用时,浏览器界面会冻结,直到调用返回.在超时的情况下,这可能会冻结浏览器很长一段时间.
有没有办法让浏览器(任何浏览器)刷新用户界面,但不执行任何Javascript?理想情况下,这将是一些命令window.update(),它将让用户界面线程刷新.
如果这是可能的,那么我可以用以下代码替换同步AJAX调用:
obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume
Run Code Online (Sandbox Code Playgroud)
我不能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;
}
Run Code Online (Sandbox Code Playgroud)
您需要将同步请求替换为异步请求并使用回调。一个过于简单的例子是:
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();
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以将匿名函数作为参数传递给 ajax 请求函数。当 ajax 完成时,将调用传递给它的responseXML 的函数。与此同时,浏览器可以自由地执行通常的操作,直到调用完成。从这里开始,代码的其余部分将继续。
| 归档时间: |
|
| 查看次数: |
1729 次 |
| 最近记录: |