EnvJS / Rhino, setTimeout () не работает

В настоящее время я настроил EnvJS на мою систему (установленную здесь ). Моя конечная цель – загрузить страницу, чтобы она обрабатывалась в течение нескольких секунд, а затем прочитала dom, чтобы получить интересующую информацию. Однако я не могу заставить setTimeout () работать, чтобы спасти мою жизнь (или JQuery, если на то пошло).

У меня есть php-скрипт, который запускает процесс:

... $ENVJS_PATH = "/var/www/project/src/envjs"; $RHINO_JAR = "rhino/js.jar"; $INIT_SCRIPT = "init.js"; $output = shell_exec("java -jar $ENVJS_PATH/$RHINO_JAR -opt -1 $ENVJS_PATH/$INIT_SCRIPT"); echo "Response from javascript:<br/> $output"; ... 

файл init.js выглядит так:

 load('/var/www/project/src/envjs/dist/env.rhino.js'); print("Loaded env.rhino.js<br/>"); // temporarily commented out //var url = "http://www.ken-soft.com"; //window.location = url; //print("<br/>Loaded "+url+"<br/>"); // Problem starts here var runAfterPause=function() { print("got here..."); // never gets called print(document.getElementById('some_id').innerHTML); } setTimeout(runAfterPause, 3000); //wait three seconds before continuing // i have also tried setTimeout("runAfterPause()", 3000); print("<br/>End<br/>"); 

Любые знания об этом будут высоко оценены. Благодарю.

Попробуйте env.rhino.1.2.js – и если серверный хостинг- носитель – это Ubuntu, попробуйте sudo apt-get install rhino rhino -opt -1 ... – и вызовите rhino -opt -1 ... вместо java -jar ...

Кажется, для меня это работает на Ubuntu 11.04, когда вы бегали прямо в оболочку – не уверены, может ли PHP shell_exec повлиять на вещи или нет.

EDIT: Действительно, это не работает; Я немного просмотрел источник и увидел, что setTimeout полагается на Timer.prototype.start = function(){}; , который, по-видимому, пуст. Если смотреть дальше, единственное, что, по-видимому, связано с синхронизацией, это Envjs.wait() – и, используя это, я могу, наконец, получить своего рода синхронизированный цикл; однако обратите внимание, что теперь он выглядит строго однопоточным (синхронным):

 print("loading " + 1.2); load('env.rhino.1.2.js'); // takes a while ... print("loaded " + 1.2); console.log(window); var c=0; function timedCount() // like this, when setTimeout calls a string! { c=c+1; print("c=" + c); if (c<10) // make a limit for the run of script: { var t; //~ t=window.setTimeout(timedCount(),100); // TypeError: fn is not a function, it is undefined. t=window.setTimeout("timedCount()",1000); // must have `t=...` - else it locks on return even w/ wait(0)! Envjs.wait(); // waits, but "timer error undefined TypeError: fn is not a function, it is undefined." if setTimout doesn't call string; wait(0) exits immediately } else Envjs.wait(0); // "reset": execute all timers and return; else here will be left hanging from previous wait() } // main: timedCount(); //~ eval("timedCount()", null); // works the same print("after timedCount()"); 

… и результаты:

 $ sudo apt-get install rhino $ wget https://github.com/thatcher/env-js $ rhino -opt -1 test.js loading 1.2 [ Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ] loaded 1.2 [Window] a c=1 c=2 c=3 c=4 c=5 c=6 c=7 c=8 c=9 c=10 after timedCount() 

Если я правильно помню, в браузере setInterval является асинхронным / многопоточным – действительно, в браузере JavaScript Shell 1.4 почти такой же код:

 var c=0; function timedCount() { c=c+1; print("c=" + c); if (c<10) { var t; t=window.setTimeout("timedCount()",1000); } } timedCount(); print("after timedCount()"); 

производит:

 c=1 after timedCount() c=2 c=3 c=4 c=5 c=6 c=7 c=8 c=9 c=10 

Метод обратного вызова определяется после назначения. Попробуйте положить его перед setTimeout

print – это метод окна.

Он используется для печати страницы с помощью принтера …

Там может быть конфликт с ним и ваш метод печати.

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

сначала работает ли ваша функция, когда вы называете ее самой? не внутри установленного тайм-аута

 var runAfterPause=function() { print("got here..."); print(document.getElementById('some_id').innerHTML); } // call function by it self runAfterPause(); 

2-я попытка запустить его как анонимную функцию внутри вашего setTimeout;

 var delay = setTimeout(function () { print("got here..."); // never gets called print(document.getElementById('some_id').innerHTML); },3000); 

это должно помочь вам отладить ваш код и увидеть, где ошибка.