Инициализация веб-работников - PullRequest
0 голосов
/ 26 октября 2019

Кажется, единственное сообщение от хоста к работнику - это postMessgage и onmessage. Если рабочий требует некоторой динамической инициализации (как в конструкторе, здесь: регулярное выражение для использования позже), каков наилучший способ сделать это?

Можно было бы позволить data быть объектом, инапример, иметь параметр action и проверять это при каждом запуске. Это кажется немного грязным.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Канал связи между различными агентами очень низкоуровневый, но на этом основании вы можете легко построить коммуникацию более высокого уровня. Я бы использовал объекты для передачи различных «событий»:

  { event: "init", data: [/d/] }

На основе этих событий вы можете создавать различные события для представления, например, вызовов функций и их ответов:

 { event: "call-init", data: [/d/] } // >>>
 { event: "return-init", data: ["done"] } // <<<

Тогдавы можете создать обертку вокруг этого, которая отправляет и обрабатывает ответ, что-то вроде:

    async function call(name, ...args) {
      channel.send("call-" + name, args);
      return await cannel.once("return-" + name);
   }

   channel.init = call.bind(null, "init");

Тогда ваш код превращается во что-то вроде:

  const channel = new Channel(worker);
  await channel.init(/d/);
 await channel.doOtherStuff();

Это простодать вам основную идею.

0 голосов
/ 26 октября 2019

Другой подход, отличающийся от хорошо разработанного решения Джонаса, - name опция *1003* : Вы можете, например, передать строку регулярного выражения в этом имени и использовать ее позже:

test.js

var a = new Worker("worker.js", {name: "hello|world"})

a.onmessage = (x) => {
  console.log("worker sent: ")
  console.log(x)
}

a.postMessage("hello")

worker.js

var regex = RegExp(this.name);

onmessage = (a) => {
  if (regex.test(a.data)) {
    postMessage("matches");
  } else {
    postMessage("no match for " + regex);
  }
}
...