停止 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代码,你可以玩