замедлить выполнение eval javascript - PullRequest
2 голосов
/ 03 августа 2011

Я создал маленького робота, такого как робот Карел ( Википедия ), который основан на JavaScript.

Karel4Web

Роботом можно управлять с помощью простых команд, таких как «вперед», «поворот» и т. Д.

Пользователь может написать программу javascript для управления роботом, которая затем выполняет функцию eval () javascripts, чтобы робот двигался.

Проблема в том, что я хочу, чтобы робот двигался медленно, чтобы вы могли видеть, что он делает, и чтобы вы могли выделить текущую строку кода в редакторе.

Текущий метод: синтаксический анализ

На данный момент я решил эту проблему (в автономной версии), проанализировав каждую строку в текстовой области, а затем построив стек действий, которые затем выполняются один за другим с помощью window.setTimeout. Но это, конечно, ограничено, потому что мне приходится писать код синтаксического анализа для каждого маленького проекта языка JavaScript, который очень трудоемок и подвержен ошибкам.

Некоторая дополнительная информация к этому:

Версия для разбора: http://abi -physik.de / _niki2 / niki.php

Разбор версии js кода: http://abi -physik.de / _niki2 / js / niki.js

Важные функции находятся внизу скрипта: run (), execute ()

В настоящее время я построчно анализирую пользовательский скрипт и добавляю действия в стек. Если синтаксический анализатор обнаружит «если», он начнет новый стек и добавит все действия в этот стек. если синтаксический анализатор затем встречает «}», он закроет стек «if» и продолжит добавлять действия в базовый стек.

Есть идеи улучшить это?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Я бы сказал, что эти функции регистрируются в какой-то очереди вместо того, чтобы они выполняли непосредственно JavaScript.

var moveQueue = [];

function forward(){
  moveQueue.push(_forward);
}
function _forward(){
    alert("move forward");
}

function backward(){
  moveQueue.push(_backward);
}
function _backward(){
    alert("move backward");
}

Чем при запуске вы используете setTimeout и

function run(){
    var curStep = 0;
   function go(){
      moveQueue[curStep]();
      curStep++;
      if(curStep<moveQueue.length){
          window.setTimeout(go,500);
      }
   }  
}

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

0 голосов
/ 03 августа 2011

Javascript не имеет функции sleep(), поэтому да, использование setTimeout или setInterval - это путь.

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

...