在javascript中测试当前线程是否为主线程

问题描述 投票:0回答:3

在javascript中,如果当前线程已经是非主线程,我想执行一个操作,或者如果当前线程是主线程,则将其传递给非主线程。

为此,如何测试当前线程是主线程还是非主线程?

如果我调用 jquery 方法

$.get()
OnSuccess 事件将在非主线程上运行。我只需在不执行任何操作的 URL 上调用
$.get()
即可实现假冒。

为什么我需要这样做?有一些 javascript 调用如果在主线程上调用会导致丑陋的警告。我想避免这个警告。警告是...

[弃用] 主线程上的同步 XMLHttpRequest 是 已弃用,因为它对最终用户的不利影响 经验。如需更多帮助,请查看 https://xhr.spec.whatwg.org/

到目前为止我已经尝试过的事情

function doOnNonMainThread( action) {
  if (thisIsANonMainThread()) {
      $.get( 'some-url', action, 'xml');
    } else {
      action();
    }
  }

更新1

我正在调用 Saxon-JS 库(XPath 评估函数)。该库依次调用同步 XMLHttpRequest。我无法修改 XPath 库,我必须按原样使用它。我在某些地方从 Ajax 成功事件中调用 XPath。在这种情况下,我没有收到任何警告 - 到目前为止一切都很好。有些地方我不在 Ajax 响应事件中调用 XPath。在这些情况下,我会收到警告。

一些回答者建议我不要调用同步 XMLHttpRequest。这不是一个可行的解决方案,因为我不控制 Saxon-JS 库。我所能控制的只是我调用 Saxon-JS 库的上下文。

javascript multithreading saxon
3个回答
1
投票

如果您的 XSLT 样式表(或动态评估的 XPath 表达式)调用 doc() 或 document() 等函数,Saxon-JS 将仅对 XMLHttpRequest 使用同步调用。 Saxon-JS 通过使用 ixsl:schedule-action 指令发出异步请求,提供了这些构造的替代方案。不幸的是,您没有使用触发同步请求的函数这一事实并不能阻止浏览器发出此警告。我不知道有什么方法可以防止出现警告,但您应该能够安全地忽略它。

PS:刚刚和同事讨论过这个问题。在某些情况下,Saxon-JS 可能仍然会同步请求其他资源,例如用于计算某些正则表达式的 Unicode 字符表。我们将进一步调查。请在 saxonica.plan.io 上提出有关 Saxon-JS 项目的问题,以便我们跟踪解决方案。


1
投票

为此,如何测试当前线程是主线程还是非主线程?

除非您明确使用 Web Worker,否则您可以(并且应该)假设您的代码始终在主线程中运行。

不要使用同步

XMLHttpRequest


0
投票

这是在 Node.js 或 Web 浏览器中对主线程进行同步测试...

export const bNode = (typeof process !== 'undefined') && (process.release.name === 'node');

function isMainThread() {
    if (bNode) {
        let bNodeWorker = false;
        let args = process.argv;
        let arWorkerJs = [ // List of all files used with Worker constructor
            "NodeWorker.js"
        ];
        for (let arg of args) {
            for (let wjs of arWorkerJs)
                if (arg.endsWith("/" + wjs))
                    bNodeWorker = true;
        }
        return !bNodeWorker;
    } else {
        // Easy test for Web browsers...
        return self === self.window;
    }
}
export const bMainThread = isMainThread();

在我的例子中,我使用上面的“bMainThread”来设置工作线程,并在 Node.js(带有 ES 模块)或 Web 浏览器之间共享 JS 源代码。例如......

if (bMainThread) {
    setupWorkerThreads();
    setupMainThreadMessageHandling();
    useWorkerThreads();
} else {
    setupWorkerMessageHandling();
}
© www.soinside.com 2019 - 2024. All rights reserved.