Javascript setTimeout在windows脚本(jscript)中不工作

Javascript setTimeout在windows脚本(jscript)中不工作,javascript,wsh,Javascript,Wsh,当我尝试在程序中运行以下代码时 setTimeout("alert('moo')", 1000); 我得到以下错误 错误:需要对象 代码:800A138F 来源:Microsoft JScript运行时错误 为什么??我调用了错误的函数吗?我想做的是延迟后续函数的执行。setTimeout是web浏览器提供的窗口对象的一种方法。它对在Windows脚本主机上运行的脚本不可用。这些脚本从开始到结束都有一个执行线程,并且没有延迟计时器 如果要暂停脚本执行,可以使用WScript对象的方法。听起来

当我尝试在程序中运行以下代码时

setTimeout("alert('moo')", 1000);
我得到以下错误

错误:需要对象
代码:800A138F
来源:Microsoft JScript运行时错误

为什么??我调用了错误的函数吗?我想做的是延迟后续函数的执行。

setTimeout
是web浏览器提供的
窗口
对象的一种方法。它对在Windows脚本主机上运行的脚本不可用。这些脚本从开始到结束都有一个执行线程,并且没有延迟计时器


如果要暂停脚本执行,可以使用
WScript
对象的方法。

听起来像是在非基于浏览器的脚本(Windows脚本主机或类似程序)中使用
setTimeout
。你不能那样做。但是,您可以使用
WScript.Sleep
短暂挂起脚本,这样可以实现类似的效果。此外,
警报
不是WSH功能;您可能需要
WScript.Echo
。关于.

的更多信息,我需要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();
函数main(){
Test.before();
_设置超时(Test.timeout1,1000);
_设置超时(Test.timeout22000);
_设置超时(Test.timeout3500);
_setTimeout(Test.error,2001);
Test.after();
}
var测试=函数(){
var ld=“-----”;
var rd=“---”;
返回{
before:function(){
日志(ld+“在”+rd之前);
},
之后:函数(){
日志(ld+“在”+rd之后);
},
timeout1:函数(){
日志(ld+“超时1”+rd);
},
超时2:函数(){
日志(ld+“超时2”+rd);
},
timeout3:函数(){
日志(ld+“超时3”+rd);
},
错误:函数(){
日志(ld+“错误”+rd);
errorFunc();
}
};
}();
var FuncQueue=函数(){
var funcQueue=[];
函数FuncItem(名称、func、waitil){
this.name=名称;
this.func=func;
this.waitil=waitil;
}
返回{
添加:函数(func、name、waitil){
push(新的FuncItem(name,func,waitil));
},
运行:函数(){
而(funcQueue.length>0){
var now=新日期().valueOf();
对于(变量i=0;inow){
继续;
}否则{
拼接(i,1);
}
日志(“正在执行:+项.名称”);
试一试{
item.func();
}捕获(e){
日志(“发生意外错误”);
}
日志(“已完成执行:+项目名称”);
打破
}
如果(funcQueue.length>0&&i>0){
if(typeof(WScript)!=“未定义”){
WScript.Sleep(50);
}
}
}
日志(“耗尽的功能队列”);
}
}
}();
函数_setTimeout(func,delayMs){
var-retval=未定义;
if(typeof(setTimeout)!=“未定义”){
retval=setTimeout(func,delayMs);//如果可用,请使用真实的
}否则{
添加(func,“setTimeout”,new Date().valueOf()+delayMs);
}
返回返回;
}
var log=函数(){
函数ms(){
如果(!ms.start){
ms.start=新日期().valueOf();
}
return new Date().valueOf()-ms.start;//报告首次调用函数后的毫秒数
}
功能板(s、n){
s+=”;
var filler=“”;
如果(s.长度
对于正在搜索警报功能以在独立脚本(Windows脚本主机环境)中工作的任何人,我建议查看记录在案并可下载的警报功能。我肯定发现这个新库对我的独立脚本很有帮助。

我们需要看到更多的代码。哈哈,不要再看到这个;-)我刚刚将
Sleep
方法和MSDN链接一起编辑到我的答案中。@Andy:LOL!回报!(现在佩卡在哪里?)