Javascript 可以在js中强制同步重绘吗?

Javascript 可以在js中强制同步重绘吗?,javascript,Javascript,我正试图强制同步重绘。这可能吗 不幸的是,我正在使用的库通过XMLHttpRequest.prototype.open(u,u,false)发送一个长时间运行的同步请求。在通过monkey patchingXMLHttpRequest.prototype.send发送请求之前,我试图使用加载指示器更新页面,但是,从未见过不透明度:0.7样式: constoldsend=XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send=函数(

我正试图强制同步重绘。这可能吗

不幸的是,我正在使用的库通过
XMLHttpRequest.prototype.open(u,u,false)
发送一个长时间运行的同步请求。在通过monkey patching
XMLHttpRequest.prototype.send发送请求之前,我试图使用加载指示器更新页面,但是,从未见过
不透明度:0.7
样式:

constoldsend=XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send=函数(…参数){
document.body.style.opacity=“0.7”;
//我能做些什么来强制在这条线上重新喷漆吗?
const retVal=oldSend.bind(this)(…args);
document.body.style.opacity=“1”;
返回返回;
}
我的大部分研究建议重构到异步的东西:

但是,我无法控制发出同步请求的代码

编辑:另一个相关帖子:


根据对问题的评论、研究和我自己的经验,这似乎是不可能的


对于我的用例,我将使页面“冻结”为加载指示器,方法是在页面上设置一些始终处于动画状态的内容。或者,更可能的是,放弃加载指示符特性。

< P>解释为什么在执行同步代码中间不可能进行屏幕更新,在

中可以找到。 8.1.4.1定义

为了协调事件、用户交互、脚本、渲染、网络等,用户代理必须使用本节所述的事件循环

这意味着渲染是与执行脚本的调用相关的事件循环的单独调用

这将在处理模型下进一步详细说明:

8.1.4.2处理模型

。。。。选择一个任务并运行它[步骤1-6]

  • 更新呈现:如果此事件循环是浏览上下文事件循环(与工作事件循环相反),则运行以下子步骤
  • 因此,在从事件循环中单个调用中执行同步代码的中间,不可能在浏览上下文中更新屏幕。


    将同步代码移动到web worker可能构成解决方案的基础(worker在单独的线程中执行),但超出了此答案的范围。

    仅供参考,
    oldSend.bind(this)(…args)
    可能是
    oldSend.apply(this,args)
    既然可以对此函数进行猴子补丁,为什么不修改dom,然后在短时间内调用原始的慢速同步函数
    setTimeout
    ?期待着看到“正确”的方法:-)。不,这是不可能的。您可以强制回流,但不能重新喷漆。顺便说一句,像这样的情况正是SJAX被弃用的原因。@JoshuaR。图书馆提出了很多这样的请求,而这些请求通常不是由我所说的东西触发的。“我想我没有办法推迟这个请求。”约书亚。我有同样的想法,尤其是对于
    send
    ,它可以工作,因为它返回
    未定义的
    ,但是调用者可以立即得到响应。如果任何人有具体证据表明不可能进行同步重绘,请将其作为答案发布,我会接受的。我不认为这会阻止API从脚本中手动调用这些步骤,但是的,它并不需要这样的API。