在javascript中,如果当前线程已经是非主线程,我想执行一个动作,或者如果当前线程是主线程,则将其传递给非主线程。
为此,我如何测试当前线程是主线程还是非主线程?
如果我调用jquery方法$.get()
,OnSuccess事件将在非主线程上运行。我只需在无操作URL上调用$.get()
即可实现传递。
为什么我需要这样做?如果在主线程上调用,有一些javascript调用会导致丑陋的警告。我想避免这个警告。警告是......
[Deprecation]主线程上的同步XMLHttpRequest是 由于其对最终用户的不利影响而被弃用 经验。如需更多帮助,请查看https://xhr.spec.whatwg.org/。
function doOnNonMainThread( action) {
if (thisIsANonMainThread()) {
$.get( 'some-url', action, 'xml');
} else {
action();
}
}
我正在调用Saxon-JS库(XPath评估函数)。该库反过来调用同步XMLHttpRequest。我无法修改XPath库,我必须按原样使用它。有些地方我在Ajax成功事件中调用XPath。在这种情况下,我没有得到任何警告 - 到目前为止一切都很好。有些地方我在一个Ajax响应事件中调用XPath。在这些情况下,我收到警告。
有些回答者建议我不要调用同步XMLHttpRequest。这不是一个可行的解决方案,因为我不控制Saxon-JS库。我可以控制的是我称之为Saxon-JS库的上下文。
答案 0 :(得分:1)
为此,我如何测试当前线程是主线程还是非主线程?
除非您明确使用Web worker,否则您可以(而且应该)假设您的代码始终在主线程中运行。
请勿使用同步XMLHttpRequest
s。
答案 1 :(得分:1)
如果您的XSLT样式表(或动态评估的XPath表达式)调用doc()或document()等函数,Saxon-JS将仅对XMLHttpRequest使用同步调用。 Saxon-JS通过使用ixsl:schedule-action指令来提供异步请求,从而为这些结构提供了替代方案。不幸的是,您没有使用触发同步请求的函数这一事实并不会阻止浏览器发出此警告。我不知道有什么方法可以阻止警告,但你应该能够安全地忽略它。
PS:刚刚和我的同事讨论过这个问题。在某些情况下,Saxon-JS会对其他资源发出同步请求,例如用于评估某些正则表达式的Unicode字符表。我们会进一步调查。请在saxonica.plan.io的Saxon-JS项目中提出一个问题,以便我们跟踪这个问题。