2010-02-04 5 views
6

Wenn ich versuche, den folgenden Code in meinem ProgrammSetTimeout nicht in Windows-Skript arbeiten (JScript)

setTimeout("alert('moo')", 1000); 

Ich erhalte die folgenden Fehler

Error: Object expected 
Code: 800A138F 
Source: Microsoft JScript runtime error 

Warum laufen? Rufe ich die falsche Funktion an? Ich möchte die Ausführung der folgenden Funktion verzögern.

+0

wir müssen mehr Code als das sehen. –

Antwort

7

Es klingt, als ob Sie setTimeout in einem nicht browserbasierten Skript (Windows Script Host oder ähnlich) verwenden. Das kannst du nicht tun. Sie können jedoch WScript.Sleep verwenden, um Ihr Skript kurzzeitig zu sperren, mit dem Sie einen ähnlichen Effekt erzielen können. Außerdem ist alert keine WSH-Funktion; Vielleicht möchten Sie WScript.Echo. Mehr über die WSH reference on MSDN.

+0

lol nicht das wieder ;-) Ich habe nur die 'Schlaf'-Methode in meine Antwort zusammen mit dem MSDN-Link bearbeitet. –

+0

Und der Penner hat deine Antwort akzeptiert, nicht meine! der Nerv ;-) –

+0

@Andy: LOL! Rückzahlung! (Jetzt, wo ist Pekka?) –

6

setTimeout ist eine Methode des window Objekts, das von Webbrowsern bereitgestellt wird. Es ist nicht für Skripts verfügbar, die unter Windows Script Host ausgeführt werden. Diese Skripte haben einen einzigen Ausführungs-Thread von Anfang bis Ende und haben keine Verzögerungs-Timer. Wenn Sie die Skriptausführung anhalten möchten, können Sie die Sleep-Methode des Objekts WScript verwenden.

3

Ich brauchte WSH, um sich wie ähnlicher Code im Browser zu benehmen, der setTimeout verwendet, also hier ist, was ich gefunden habe.

Lassen Sie einfach alles in einer Warteschlange ausführen. Sie können weiterhin zur Warteschlange hinzufügen. Das Programm wird nur beendet, wenn keine Funktionen in der Warteschlange verbleiben.

Es unterstützt keine Strings für eval, nur Funktionen.

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(); 
0

Für alle, die für die Alarm-Funktion in einem eigenständigen Skript (Windows Script Host-Umgebung) zu arbeiten suchen, empfehle ich auschecken jPaq's Alarm-Funktion, die here und herunterladbare here dokumentiert. Ich habe definitiv gefunden, dass diese neue Bibliothek für meine Stand-Alone-Skripte hilfreich ist.