Когда я пытаюсь выполнить следующий код в своей программе
setTimeout("alert('moo')", 1000);
Я получаю следующую ошибку
Error: Object expected
Code: 800A138F
Source: Microsoft JScript runtime error
Почему? Я вызываю неправильную функцию? То, что я хочу сделать, задержать выполнение последующей функции.
StartCity отлично работает с C #\Msbuild и свободен от обвинения до 20 разработчиков.
-121--4055840- setTimeout
- метод объекта окна
, предоставляемый веб-браузерами. Он недоступен для сценариев, запущенных на узле сценариев Windows. Эти сценарии имеют один поток выполнения от начала до конца и не имеют таймеров задержки.
Если требуется приостановить выполнение сценария, можно использовать метод Sleep объекта WScript
.
Похоже, что вы используете setTimeout
в сценарии, не основанном на браузере (Windows Script Host или аналогичном). Ты не можешь этого сделать. Однако можно использовать WScript.Sleep
, чтобы ненадолго приостановить сценарий, с помощью которого можно добиться аналогичного эффекта. Кроме того, аларм
не является функцией WSH; может потребоваться WScript.Echo
. Подробнее о ссылке WSH на MSDN .
setTimeout
- это метод объекта window
, предоставляемый веб-браузерами. Это недоступно для скриптов, работающих на Windows Script Host. Эти сценарии имеют один поток выполнения от начала до конца и не имеют таймеров задержки.
Если вы хотите приостановить выполнение скрипта, вы можете использовать метод Sleep объекта WScript
.
Мне нужно, чтобы WSH вел себя как аналогичный код в браузере, использующем setTimeout, поэтому вот что я придумал.
Просто пусть ваш единственный поток выполняет все в очереди. Вы можете продолжать добавлять в очередь. Программа завершится только тогда, когда в очереди не останется функций.
Он не поддерживает строки для eval, только функции.
function main() {
Test.before();
_setTimeout(Test.timeout1, 1000);
_setTimeout(Test.timeout2, 2000);
_setTimeout(Test.timeout3, 500);
_setTimeout(Test.error, 2001);
Test.after();
}
var Test = function() {
var ld = "---- ";
var rd = " ----";
return {
before : function() {
log(ld + "Before" + rd);
},
after : function() {
log(ld + "After" + rd);
},
timeout1 : function() {
log(ld + "Timeout1" + rd);
},
timeout2 : function() {
log(ld + "Timeout2" + rd);
},
timeout3 : function() {
log(ld + "Timeout3" + rd);
},
error : function() {
log(ld + "error" + rd);
errorFunc();
}
};
}();
var FuncQueue = function() {
var funcQueue = [];
function FuncItem(name, func, waitTil) {
this.name = name;
this.func = func;
this.waitTil = waitTil;
}
return {
add : function(func, name, waitTil) {
funcQueue.push(new FuncItem(name, func, waitTil));
},
run : function() {
while (funcQueue.length > 0) {
var now = new Date().valueOf();
for ( var i = 0; i < funcQueue.length; i++) {
var item = funcQueue[i];
if (item.waitTil > now) {
continue;
} else {
funcQueue.splice(i, 1);
}
log("Executing: " + item.name);
try {
item.func();
} catch (e) {
log("Unexpected error occured");
}
log("Completed executing: " + item.name);
break;
}
if (funcQueue.length > 0 && i > 0) {
if (typeof (WScript) != "undefined") {
WScript.Sleep(50);
}
}
}
log("Exhausted function queue");
}
}
}();
function _setTimeout(func, delayMs) {
var retval = undefined;
if (typeof (setTimeout) != "undefined") {
retval = setTimeout(func, delayMs); // use the real thing if available
} else {
FuncQueue.add(func, "setTimeout", new Date().valueOf() + delayMs);
}
return retval;
}
var log = function() {
function ms() {
if (!ms.start) {
ms.start = new Date().valueOf();
}
return new Date().valueOf() - ms.start; // report ms since first call to function
}
function pad(s, n) {
s += "";
var filler = " ";
if (s.length < n) {
return filler.substr(0, n - s.length) + s;
}
return s;
}
return function(s) {
if (typeof (WScript) != "undefined") {
WScript.StdOut.WriteLine(pad(ms(), 6) + " " + s);
} else {
// find a different method
}
}
}();
FuncQueue.add(main, "main");
FuncQueue.run();