我做了一个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
?
答案 0 :(得分:1)
我对coffeeScript不是很熟悉,但这可能会给你一个想法。
无法使用for循环。有懒惰评估目的的生成器函数。然而,虽然你可以使用,但我认为你不需要发电机。相反,我认为承诺可能非常方便。您可以使用Promise.all()
。但首先,您必须创建一个实用程序函数,以在实例化工作程序时返回一个promise。
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是您可以使用的附加代码。
答案 1 :(得分:0)
为什么需要停止循环? 看起来你正在尝试做同步任务,这意味着工人们一个接一个地完成工作。 但关于工人的全部事情是它们是异步的......
我想如果你想让你的代码同步工作,你需要做类似的事情:
highlightBase: ->
codes = document.getElementsByClassName('hljs')
if (codes)
for code in codes
code.innerHTML = function_that_was_before_made_by_worker()
它就是......