Javascript Параллельное управление - PullRequest
2 голосов
/ 07 сентября 2011

Как образовательный проект, я пишу (еще один) редактор с подсветкой синтаксиса в стиле JavaScript.

Чтобы редактор работал быстро, я, очевидно, предпочел асинхронную работу подсветчика, однако в модели, которую я использую, мне нужно иметь возможность завершить подсветку перед запуском другой, если что-то набрано до завершения текущего подсветчика, и знать, что он заканчивается до запуска нового.

Я думал о том, чтобы сделать что-то вроде следующего:

var terminate = false;
var terminated = false;

function work() {
  while(!terminate)
    console.log('working');
  terminated = true;
}

function stop() {
  terminate = true;
  while(!terminated);
  console.log('stopped');
}

setTimeout(work, 0);
setTimeout(stop, 10);

Этот пример, однако, не работает, и я попытался использовать больше setTimeouts вместо занятого ожидания, но безрезультатно.

Есть ли способ реализовать такую ​​систему в JavaScript или мне следует использовать какую-то альтернативу (или обе)?

Ответы [ 2 ]

8 голосов
/ 07 сентября 2011

Если вы можете выполнять большую часть своей работы без доступа DOM, это было бы идеально для веб-работников.

Чтобы исправить пример, попробуйте применить управление, используя setTimeout с 0.Это работает:

var terminate = false;
var terminated = false;

function work() {
  if(!terminate) {
    console.log('working');
    setTimeout(work, 0);
  }
  else terminated = true;

}

function stop() {
  terminate = true;
  if(!terminated) {
      setTimeout(stop,0);
  }
  else console.log('stopped');
}

setTimeout(work, 0);
setTimeout(stop, 100);

edit

Чтобы объяснить проблему с исходным фрагментом кода: Javascript является однопоточным (если вы не используете веб-работников).Вы можете использовать события, обратные вызовы и setTimeout для достижения иллюзии параллелизма, но на самом деле вы говорите среде выполнения, чтобы она выполняла вашу функцию обратного вызова в будущем в одном потоке выполнения.В вашем случае stop никогда не выполнялся.После истечения 10 мс было запланировано выполнение «next» (т. Е. После завершения work. Поскольку work никогда не завершалось, stop никогда не мог выполняться.

Так что любой очевидный параллелизм вы хотитевыйти из javascript будет совместным. Ваш рабочий поток должен будет сделать паузу и явно позволить «другим вещам» произойти, чтобы поддержать иллюзию.

2 голосов
/ 07 сентября 2011

В этом случае рассмотрите возможность использования Рабочих . Большинство современных браузеров их поддерживают. Без рабочих в javascript нет ничего конкретного (что хорошо) - все делается в одном потоке.

Многие setTimeout() звонки - убийца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...