在工人完成之前停止for循环

时间:2016-09-02 15:12:21

标签: for-loop coffeescript worker

我做了一个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

2 个答案:

答案 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()

它就是......