Интерпретация JavaScript в Java с помощью Rhino: приостановка / возобновление сценариев

Я использую javax.script. * пакет JDK. В частности, я использую движок JavaScript, который, судя по тому, что я читал, похоже, основан на разработанном Mozilla интерпретаторе JavaScript в Java под названием Rhino.

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

Чтобы проиллюстрировать, что я имею в виду, представьте этот код JavaScript:

function myJSFunction() {
    print("Hello ");
    mysteriousPauseFunction(); // this is the part I'm wondering about.  basically, the script should break here and resume later at Java's discretion...
    // upon reaching this comment, we know now that Java has told JavaScript that it's okay to resume, so the next line will now be executed...
    print("world");
}

Если часть «приостановка» / «прерывание» включает привязку функции Java и передачу ей ссылки на текущий ScriptEngine или что-то еще, это меня устраивает. Я думаю, что это, вероятно, повлечет за собой: приостановку JavaScript изнутри Java.

Я погуглил и обнаружил, что ключевое слово здесь выглядит как «продолжения».«Насколько я могу судить, Rhino поддерживает продолжения только в интерпретируемом режиме (а не в скомпилированном режиме), что, как я вижу, достигается установкой« контекста »на -2. Поскольку встроенный JDK ScriptEngine, похоже, ничего не упоминает о контекста (или, может быть, я его упустил), означает ли это, что я должен загрузить и использовать библиотеку Mozilla Rhino напрямую вместо этого?

И нужны ли мне продолжения Rhino для этого? Я нашел полезное руководство на продолжениях Rhino, но, прочитав его, я не уверен на 100%, сможет ли он выполнить то, что я описал выше. Если это - то, что я ищу, то мой последующий вопрос касается упомянутой "сериализации": означает ли это, что, когда я возобновлю свой скрипт, все переменные будут сброшены, если я не сериализую их?

Обновление: Похоже, что это возможно с Rhino. Вот что у меня есть в моем JavaScript; после кода я объясню, что он делает ...

var end = new Continuation();

function myJSFunction()
{
    print("Hello ");
    var kont = new Continuation();
    storePause(script, kont); // script is previously bound by Java into the JavaScript.  it is a reference to the script itself.
    end();
    print("world");

}

Мой "storePa" Функция use () "- это написанная мною функция Java, привязанная к JavaScript, но сейчас она ничего не делает. Моя следующая цель будет заключаться в том, чтобы конкретизировать его код таким образом, чтобы он сохранял информацию о продолжении и сценарии как объекты Java, чтобы Java могла возобновить выполнение сценария позже.

Прямо сейчас он приостанавливает / «прерывает» скрипт после того, как напечатано «Hello», но до того, как напечатано «world», так что это доказывает мне, что таким образом можно приостановить скрипт.

Итак, все, что мне оставалось выяснить на данном этапе, - это как возобновить продолжение.Обратите внимание, что приведенное выше работает с использованием механизма сценариев JDK по умолчанию (на этом этапе мне не нужно было беспокоиться о интерпретируемом режиме и скомпилированном режиме - похоже, по умолчанию используется интерпретируемый режим), но это похоже на процесс возобновления сценария потребуется библиотека Mozilla Rhino.

15
задан Josh1billion 24 December 2011 в 04:20
поделиться