在web worker中产生 - 是setTimeout,还是我必须退出?

时间:2014-05-01 19:15:04

标签: javascript typescript settimeout web-worker

在我的网络工作者中,我必须在循环中进行大量处理。在C#或Java世界中,我将其编写如下(Java):

// main code:
public static void mainLoop() {
    for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
        Object item = it.next();
        processThisOne (item);
    }
}

// async method
static boolean keepRunning = true;
public static void abort() {
    keepRunning = false;
}

以上人员不会在网络工作者中工作。当主循环在上面运行时,后续的postMessage()调用将被处理。

我可以执行以下操作(现在使用打字稿):

// kicked off by postMessage event handler
public mainLoop () : void {
    if (! keepRunning)
        return;
    Object item = it.next();
    processThisOne (item);
    worker.setTimeout(mainLoop, 0);
}

// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
    keepRunning = false;
}

相反,我能基本上屈服如下吗?如果是这样,这是否很快(在setTimeout上的线程之间有任务切换)?

// kicked off by postMessage event handler
public mainLoop () : void {
    for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
        Object item = it.next();
        processThisOne (item);

        // yield
        worker.setTimeout(nothing, 0);
    }
}

// called by setTimeout:
public static void nothing() {
}

// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
    keepRunning = false;
}

如果以上工作,那么我的代码会更简单。问题是,setTimeout()是否会产生?或者它只是在我正在执行的处理结束后将该调用排队?

1 个答案:

答案 0 :(得分:0)

我已经运行了一些测试,我相信答案是你必须退出你所在的方法.setTimeout()队列是方法,但是在网络工作者没有运行之前不会运行它。