В настоящее время я настроил 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);
это должно помочь вам отладить ваш код и увидеть, где ошибка.