停止 for 循环直到 worker 完成
Stopping a for loop until worker is done
我做了一个 for
循环,它调用网络工作者来突出显示 code
标签内的代码
我做了这个循环,这叫我的工人来完成这项工作。
highlightBase: ->
codes = document.getElementsByClassName('hljs')
if (codes)
for code in codes
HighlightWorker = new Worker('/js/highlight_worker.js')
HighlightWorker.onmessage = (event) ->
code.innerHTML = event.data
HighlightWorker.postMessage(code.textContent)
这工作得很好,但我需要停止这个循环,直到工作人员完成。
是否可以停止此循环并在之后继续,或者我需要添加一些 timeOut
?
为什么要停止循环?
看起来您正在尝试执行同步任务,这意味着工作人员一个接一个地完成他们的工作。
但是关于工人的全部事情是他们是异步的......
我想如果你想让你的代码同步工作,你需要做这样的事情:
highlightBase: ->
codes = document.getElementsByClassName('hljs')
if (codes)
for code in codes
code.innerHTML = function_that_was_before_made_by_worker()
而且它是...
我不是很熟悉 very coffeeScript 但这可能会给你一个想法。
无法停止 for 循环。有用于惰性评估目的的生成器函数。但是,尽管您可以使用,但我认为您在这里不需要发电机。相反,我想 promises 可能会非常方便。您可以使用 Promise.all()
。但是首先你必须创建一个效用函数来 return 当你实例化一个 worker 时的承诺。
function postMessageToWorker(worker,message){
var p = new Promise((resolve,reject) => worker.onmessage = resolve);
worker.postMessage(message);
return p;
}
var proms = [];
if (codes)
for (var code of codes)
proms.push(postMessageToWorker(new Worker('/js/highlight_worker.js'), code.textContent));
Promise.all(proms).then(a => a.forEach((e,i) => codes[i].innerHTML = e.data));
Here是一个plunker代码,你可以玩
我做了一个 for
循环,它调用网络工作者来突出显示 code
标签内的代码
我做了这个循环,这叫我的工人来完成这项工作。
highlightBase: ->
codes = document.getElementsByClassName('hljs')
if (codes)
for code in codes
HighlightWorker = new Worker('/js/highlight_worker.js')
HighlightWorker.onmessage = (event) ->
code.innerHTML = event.data
HighlightWorker.postMessage(code.textContent)
这工作得很好,但我需要停止这个循环,直到工作人员完成。
是否可以停止此循环并在之后继续,或者我需要添加一些 timeOut
?
为什么要停止循环? 看起来您正在尝试执行同步任务,这意味着工作人员一个接一个地完成他们的工作。 但是关于工人的全部事情是他们是异步的......
我想如果你想让你的代码同步工作,你需要做这样的事情:
highlightBase: ->
codes = document.getElementsByClassName('hljs')
if (codes)
for code in codes
code.innerHTML = function_that_was_before_made_by_worker()
而且它是...
我不是很熟悉 very coffeeScript 但这可能会给你一个想法。
无法停止 for 循环。有用于惰性评估目的的生成器函数。但是,尽管您可以使用,但我认为您在这里不需要发电机。相反,我想 promises 可能会非常方便。您可以使用 Promise.all()
。但是首先你必须创建一个效用函数来 return 当你实例化一个 worker 时的承诺。
function postMessageToWorker(worker,message){
var p = new Promise((resolve,reject) => worker.onmessage = resolve);
worker.postMessage(message);
return p;
}
var proms = [];
if (codes)
for (var code of codes)
proms.push(postMessageToWorker(new Worker('/js/highlight_worker.js'), code.textContent));
Promise.all(proms).then(a => a.forEach((e,i) => codes[i].innerHTML = e.data));
Here是一个plunker代码,你可以玩