Почему я получаю ошибку бесконечного цикла inp5.js? - PullRequest
1 голос
/ 23 марта 2019

С помощью простого цикла я могу вызвать потенциальное исключение бесконечного цикла в веб-редакторе p5.js

function setup() {
  var cnt = 0;
  var startTime = new Date().getTime();
  for (i = 0; i < 80000; i++) {
    console.log(cnt++);
  }
  var endTime = new Date().getTime();
  console.log("done in " + (endTime - startTime) + " milliseconds");
}

Дает вывод:

Выход из потенциального бесконечного цикла в строке 5. Чтобы отключить защиту от цикла: добавьте «// noprotect» к своему коду за 501 миллисекунду

Что неудивительно, так как я вижу, что порог был увеличен до500мс в p5.js-web-editor выдает 174

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

Например:

function setup() {
  var cnt = 0 // no semicolon here..
  var startTime = new Date().getTime();
  for (i = 0; i < 80000; i++) {
    console.log(cnt++);
  }
  var endTime = new Date().getTime();
  console.log("done in " + (endTime - startTime) + " milliseconds");
}

Дает мне вывод:

79999

сделано за 1737 миллисекунд

Мой вопрос: почему удаление точки с запятой нарушает обнаружение бесконечного цикла в веб-редакторе p5.js?

1 Ответ

0 голосов
/ 30 марта 2019

Веб-редактор p5.js может вызвать исключение, когда обнаруживает бесконечный цикл в работающем эскизе.

Логика, которую веб-редактор использует для обнаружения бесконечных циклов, довольно проста, если цикл выполняет в течение более 500 мсек , исключение выдается. Это исключение может сбивать с толку, поскольку цикл, возможно, был почти готов к завершению в момент возникновения исключения с этим сообщением:

Выходящий из потенциальной бесконечной петли

Слово потенциал важно для понимания сообщения. Эта строка кода вызовет исключение:

while(true);

но любой конечный цикл, который выполняется более 500 мс, также вызовет сообщение.

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

var cnt = 0;
// noprotect
while(cnt < 80000)console.log(cnt++);

Этот код будет регистрировать числа от 0 до 79999. Перед добавлением комментария noprotect обязательно ознакомьтесь с кодом внимательно. Небольшая ошибка может превратить конечный цикл в бесконечный цикл:

var cnt = 0;
// noprotect
while(cnt < 80000)console.log(cnt);

Забыв увеличить cnt, мы создали бесконечный цикл, который не будет обнаружен веб-редактором p5.js. Этот цикл будет выполняться, пока браузер не обнаружит его и не предложит пользователю остановить его или подождать.

В последней части вопроса спрашивается, почему удаление точки с запятой в конце строки изменяет поведение защиты цикла. Ответ прост: редактор должен добавить инструментарий, чтобы обеспечить обнаружение. Отсутствие точек с запятой приводит к тому, что редактор неправильно обрабатывает код. Рекомендуется заканчивать операторы javascript точкой с запятой. См. Ответы на . Вы рекомендуете использовать точки с запятой после каждого утверждения в javascript

Резюме

  • Веб-редактор p5.js поможет вам избежать длительных циклов
  • Используйте комментарий noprotect для преднамеренных длинных циклов
  • использовать точку с запятой для завершения операторов javascript
...