2010-02-04 18 views
6

Quando provo a fare funzionare il seguente codice nel mio programmanon setTimeout lavorare in script di Windows (JScript)

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

ottengo il seguente errore

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

Perché? Sto chiamando la funzione sbagliata? Quello che voglio fare è ritardare l'esecuzione della funzione successiva.

+0

avremo bisogno di vedere più codice di questo. –

risposta

7

Sembra che tu stia usando setTimeout in uno script non basato su browser (Windows Script Host o simile). Non puoi farlo. Tuttavia, è possibile utilizzare WScript.Sleep per sospendere brevemente lo script, con il quale è possibile ottenere un effetto simile. Inoltre, alert non è una funzione WSH; potresti volere WScript.Echo. Maggiori informazioni su WSH reference on MSDN.

+0

lol non è più così ;-) Ho appena modificato il metodo 'Sleep' nella mia risposta insieme al link MSDN. –

+0

E il barbone ha accettato la tua risposta, non la mia! il nervo ;-) –

+0

@Andy: LOL! Restituire! (Ora dov'è Pekka?) –

6

setTimeout è un metodo dell'oggetto window fornito dai browser web. Non è disponibile per gli script in esecuzione su Windows Script Host. Questi script hanno un singolo thread di esecuzione dall'inizio alla fine e non hanno timer di ritardo.

Se si desidera sospendere l'esecuzione dello script, è possibile utilizzare il metodo Sleep dell'oggetto WScript.

3

Avevo bisogno di WSH per comportarmi come un codice simile nel browser che utilizza setTimeout, quindi ecco cosa mi è venuto in mente.

Basta che il thread singolo esegua tutto in una coda. Puoi continuare ad aggiungere alla coda. Il programma terminerà solo quando nessuna funzione viene lasciata in coda.

Non supporta le stringhe per eval, solo funzioni.

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

Per chi è alla ricerca per la funzione di allarme di lavorare in uno script autonomo (ambiente Windows Script Host), mi consiglia di controllare jPaq's funzione di allarme che viene documentato here e scaricabile here. Ho sicuramente trovato questa nuova libreria utile per i miei script stand-alone.

Problemi correlati