我需要创建异步执行任务(纯JS),即创建和使用XPCOM组件(使用Components.classes和Components.interfaces)。 但是,Worker和ChromeWorker无权访问组件。另外,我无法向它们传递在主线程(postMessage)中创建的XPCOM组件,因为XPCOM组件不可序列化。
似乎可以使用nsIThread和nsIThreadManager,但文档说明了
在2.0之前的Gecko版本中,可以创建真正的异步线程。 虽然这通常可以在没有严重不利影响的情况下实现,但它远非安全 并经常导致不可预测的崩溃。因此,从Gecko 2.0开始,它不再存在 可以将JavaScript对象从一个线程传递到另一个线程,从而构成线程管理器 从JavaScript中无法使用。
我不想引入与Gecko 2.0的任何不兼容性。
还有其他方法吗?
P上。 S.我发现(Chrome)工作者根本不可用,因为他们既没有访问DOM也没有访问组件。为什么人们会想要使用它们?
答案 0 :(得分:0)
不,大多数XPCOM组件都不是线程安全的,因此从不同的线程使用它们只会导致崩溃(这就是为什么线程管理器无法访问脚本)。如果您的任务包含大量计算 - 使用Worker
将其从主线程移出postMessage
以告知主线程在必要时访问XPCOM。如果它主要是访问XPCOM那么它当然是没有用的。您必须在主线程上完成工作并将其拆分为小块以确保主线程未被阻止。您可以使用nsIEventTarget.dispatch()
来安排下一个处理步骤,如下所示:
var thread = Components.classes["@mozilla.org/thread-manager;1"]
.getService(Components.interfaces.nsIThreadManager)
.currentThread;
var currentStep = -1;
function nextStep()
{
currentStep++;
//
// Execute step currentStep here
//
// Schedule next step
thread.dispatch(nextStep, thread.DISPATCH_NORMAL);
}
nextStep();
文档: