0
在我的网络工作者,我必须做一个循环处理吨。在C#或Java世界中,我将按如下方式对其进行编码(Java):在网络工作者中产生 - setTimeout够了,还是我必须退出?
// 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;
}
以上不适用于web worker。当主循环运行在上面时,后续的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()是否会产生?或者它只是排队的是呼吁处理后我目前表演结束?
'it'从哪里获得物品? – Bergi
所以你想从另一个postMessage处理程序调用'abort()'来拦截“循环”? – Bergi
@Bergi - 不,我只想调用yield来处理一个postMessage,我可以得到另一个。 –