当我尝试在程序中运行以下代码时
setTimeout("alert('moo')", 1000);
我收到以下错误
Error: Object expected
Code: 800A138F
Source: Microsoft JScript runtime error
为什么呢?我打电话给错了吗?我想要做的是延迟后续功能的执行。
答案 0 :(得分:8)
听起来你在非基于浏览器的脚本(Windows脚本宿主或类似脚本)中使用setTimeout
。你不能这样做。但是,您可以使用WScript.Sleep
暂时暂停脚本,您可以使用它来实现类似的效果。此外,alert
不是WSH功能;你可能想要WScript.Echo
。有关WSH reference on MSDN的更多信息。
答案 1 :(得分:6)
setTimeout
是网络浏览器提供的window
对象的一种方法。它不适用于在Windows脚本宿主上运行的脚本。这些脚本从头到尾都有一个执行线程,没有延迟计时器。
如果要暂停脚本执行,可以使用WScript
对象的Sleep方法。
答案 2 :(得分:4)
我需要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();
答案 3 :(得分:0)