当我尝试在我的程序中运行以下代码时
setTimeout("alert('moo')", 1000);
我收到以下错误
Error: Object expected
Code: 800A138F
Source: Microsoft JScript runtime error
为什么?我调用了错误的函数吗?我想要做的是延迟后续功能的执行。
当我尝试在我的程序中运行以下代码时
setTimeout("alert('moo')", 1000);
我收到以下错误
Error: Object expected
Code: 800A138F
Source: Microsoft JScript runtime error
为什么?我调用了错误的函数吗?我想要做的是延迟后续功能的执行。
听起来您正在使用setTimeout
非基于浏览器的脚本(Windows Script Host 或类似的)。你不能那样做。但是,您可以使用WScript.Sleep
暂时挂起您的脚本,从而获得类似的效果。另外,alert
不是 WSH 功能;你可能想要WScript.Echo
。更多关于 MSDN 上的 WSH 参考资料。
setTimeout
是window
Web 浏览器提供的对象的方法。它不适用于在 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();